1. ホーム
  2. マットラボ

[解決済み】MATLABでxkcd風グラフを作る

2022-04-05 20:08:44

質問

だから、才能ある人たちは、どうすれば xkcd スタイルグラフ Mathematicaで , LaTeXで , Pythonで そして Rで をすでに使用しています。

MATLAB を使って上のようなプロットを作るにはどうしたらよいでしょうか?

私が試したこと

くねくねした線は作りましたが、くねくねした軸はできませんでした。くねくねの線で上書きすることしか思いつかなかったのですが、実際の軸を変更できるようにしたいのです。また、Humorフォントを動作させることができませんでした、使用したコードビットは。

 annotation('textbox',[left+left/8 top+0.65*top 0.05525 0.065],...
'String',{'EMBARRASSMENT'},...
'FontSize',24,...
'FontName','Humor',...
'FitBoxToText','off',...
'LineStyle','none');

くねくねとした線は、小さなランダムなノイズを加えて平滑化する実験をしてみました。

 smooth(0.05*randn(size(x)),10)

でも、交差したときに周囲に現れる白い背景を作ることができなくて......。

どうすればいいですか?

この問題を解決する方法は2つあると思います。1つ目は、プロットフィーチャーのx/y座標にジッターを追加する方法です。これはプロットを簡単に変更できるという利点がありますが、軸を xkcdyfied にしたい場合は自分で描画しなければなりません ( Rody Oldenhuisのソリューション ). 2 番目の方法は、ジッターのないプロットを作成し、そのプロットに imtransform を使用して、画像にランダムな歪みを適用します。これはどんなプロットでも使えるという利点がありますが、編集可能なプロットではなく、画像になってしまいます。

まず#2、そして#1への挑戦を以下に紹介する(#1の方が好きな人は、以下を参照のこと)。 Rodyのソリューション !).

このソリューションは、2つの重要な機能に依存しています。 EXPORT_FIG をファイル交換で取得し、アンチエイリアスのかかったスクリーンショットを取得します。 IMTRANSFORM をクリックすると、変形が得られます。

%# define plot data
x = 1:0.1:10;
y1 = sin(x).*exp(-x/3) + 3;
y2 = 3*exp(-(x-7).^2/2) + 1;

%# plot
fh = figure('color','w');
hold on
plot(x,y1,'b','lineWidth',3);
plot(x,y2,'w','lineWidth',7);
plot(x,y2,'r','lineWidth',3);

xlim([0.95 10])
ylim([0 5])
set(gca,'fontName','Comic Sans MS','fontSize',18,'lineWidth',3,'box','off')

%# add an annotation 
 annotation(fh,'textarrow',[0.4 0.55],[0.8 0.65],...
     'string',sprintf('text%shere',char(10)),'headStyle','none','lineWidth',1.5,...
     'fontName','Comic Sans MS','fontSize',14,'verticalAlignment','middle','horizontalAlignment','left')

%# capture with export_fig
im = export_fig('-nocrop',fh);

%# add a bit of border to avoid black edges
im = padarray(im,[15 15 0],255);

%# make distortion grid
sfc = size(im);
[yy,xx]=ndgrid(1:7:sfc(1),1:7:sfc(2));
pts = [xx(:),yy(:)];
tf = cp2tform(pts+randn(size(pts)),pts,'lwm',12);
w = warning;
warning off images:inv_lwm:cannotEvaluateTransfAtSomeOutputLocations
imt = imtransform(im,tf);
warning(w)

%# remove padding
imt = imt(16:end-15,16:end-15,:);

figure('color','w')
imshow(imt)


ジッターの最初の試みは以下の通りです。

%# define plot data
x = 1:0.1:10;
y1 = sin(x).*exp(-x/3) + 3;
y2 = 3*exp(-(x-7).^2/2) + 1;

%# jitter
x = x+randn(size(x))*0.01;
y1 = y1+randn(size(x))*0.01;
y2 = y2+randn(size(x))*0.01;

%# plot
figure('color','w')
hold on
plot(x,y1,'b','lineWidth',3);
plot(x,y2,'w','lineWidth',7);
plot(x,y2,'r','lineWidth',3);

xlim([0.95 10])
ylim([0 5])
set(gca,'fontName','Comic Sans MS','fontSize',18,'lineWidth',3,'box','off')