所以才华横溢的人已经想出如何制作in Mathematica,in LaTeX,in Python和in R .
如何使用MATLAB生成如上图所示的图?
我尝试了什么
我创造了扭曲的线条,但我无法得到摇摆的轴 . 我想到的唯一解决方案是用摇摆的线覆盖它们,但我希望能够改变实际的轴 . 我也无法使幽默字体工作,使用的代码位是:
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)
但是当它们交叉时,我无法使白色背景出现在它们周围......
4 回答
第一步...找到你喜欢的系统字体(使用函数listfonts查看可用的内容)或安装一个与xkcd的手写样式相匹配的字体 . 我在this blog post中提到了用户ch00f的"Humor Sans" TrueType字体,并将其用于我后续的示例 .
在我看来,你通常需要三个不同的修改图形对象来制作这些类型的图形:axes object,line object和text object . 您可能还希望annotation object使事情变得更容易,但我现在已经做过,因为它可能比上述三个对象更难实现 .
我创建了创建三个对象的包装函数,覆盖了某些属性设置,使它们更像xkcd . 一个限制是它们生成的新图形在某些情况下不会更新(比如调整轴的大小时文本对象上的边界框),但这可以通过更完整的面向对象的实现来解决,该实现涉及从handle class继承,使用events and listeners等 . 现在,这是我更简单的实现:
xkcd_axes.m:
xkcd_text.m:
xkcd_line.m:
这是一个示例脚本,使用这些脚本重新创建上面的漫画 . 我通过使用ginput用鼠标在图中标记点来重新创建线条,捕获它们,然后根据我的需要绘制它们:
而且(小号)这是由此产生的情节!:
我没有重新实现所有各种绘图功能,而是想创建一个可以将任何现有绘图转换为xkcd样式绘图的通用工具 .
这种方法意味着您可以使用标准MATLAB函数创建绘图并对其进行样式设置,然后在完成后,您可以在保留绘图的整体样式的同时以xkcd样式重新渲染绘图 .
例子
Plot
Bar & Plot
Box & Plot
它是如何工作的
该函数通过迭代轴的子项来工作 . 如果孩子的类型为
line
或patch
,则会略微扭曲他们 . 如果子类型为hggroup
,则迭代hggroup
的子子元素 . 我计划支持其他情节类型,例如image
,但目前尚不清楚扭曲图像以获得xkcd风格的最佳方法是什么 .最后,为了确保失真看起来是均匀的(即,短线不会比长线更加分散),我以像素为单位测量线长度,然后以与其长度成比例的方式测量样本 . 然后,我为每个第N个样本添加噪声,这些样本产生的线条具有或多或少相同的失真量 .
守则
而不是粘贴数百行代码,我只会链接到gist of the source . 此外,源代码和生成上述示例的代码可以免费获得GitHub .
正如您从示例中看到的那样,虽然我计划在找到最佳方法时立即实施,但它还没有扭曲轴本身 .
我看到两种解决方法:第一种方法是在绘图要素的x / y坐标上添加一些抖动 . 这样做的好处是您可以轻松修改绘图,但如果您想让它们xkcdyfied(参见@Rody Oldenhuis' solution),则必须自己绘制轴 . 第二种方法是创建一个非抖动的图,并使用
imtransform
对图像应用随机失真 . 这样做的好处是可以在任何情节中使用它,但最终会得到一个图像,而不是一个可编辑的图 .我将首先显示#2,然后尝试#1(如果您更喜欢#1,请查看Rody's solution!) .
此解决方案依赖于两个关键功能:来自文件交换的EXPORT_FIG以获得抗锯齿的屏幕截图,以及IMTRANSFORM来获得转换 .
这是我最初的抖动尝试
那么,这是我的不那么粗暴但仍然不太完美的尝试:
结果:
要做的事:
找到更好的功能(更好地分段定义它们)
将"annotations"和波浪线添加到它们描述的曲线中
找到比Comic Sans更好的字体!
将所有内容概括为函数
plot2xkcd
,以便我们可以将任何绘图/图形转换为xkcd样式 .