gpt4 book ai didi

matlab - MATLAB 中的 xkcd 样式图

转载 作者:太空宇宙 更新时间:2023-11-03 19:04:58 25 4
gpt4 key购买 nike

xkcd-style graph

如此有才华的人已经想出了如何制作xkcd样式图 in Mathematica , in LaTeX , in Pythonin 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)

但是当它们相交时,我无法使它们周围出现白色背景......

最佳答案

我看到有两种方法可以解决这个问题:第一种方法是向绘图特征的 x/y 坐标添加一些抖动。这样做的好处是您可以轻松修改绘图,但如果您想让它们 xkcdyfied,则必须自己绘制轴(参见 @Rody Oldenhuis' solution)。第二种方法是创建一个非抖动图,并使用 imtransform 对图像应用随机失真。这样做的好处是您可以将它用于任何绘图,但您最终得到的是图像,而不是可编辑的绘图。

我将首先展示 #2,然后是我在下面的 #1 的尝试(如果你更喜欢 #1,请查看 Rody's solution !)。

enter image description here

这个解决方案依赖于两个关键函数: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)

这是我最初的抖动尝试

enter image description here

%# 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')

关于matlab - MATLAB 中的 xkcd 样式图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12701841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com