在 TeX 中创建 xkcd 样式图

在 TeX 中创建 xkcd 样式图

图表的独特风格韓國具有信息丰富且漂亮的手绘风格。我猜它们实际上是手绘的,但最近在我们的 Mathematica 合作伙伴网站上,有人问如何用 Mathematica 的绘图函数绘制类似的图表(xkcd-样式图表)。

xkcd 图

现在,即使没有 Mathematica,这也应该是可能的,但我很难把细节弄对。可以用类似的设计在 TeX 中创建这样的图表吗?我的第一次尝试看起来不是特别好,但这里是(字体来自http://antiyawn.com/uploads/humorsans.html):

    \documentclass{standalone}
    \usepackage{tikz,color}
    \usepackage{pgfplots}
    \usepackage{fontspec}
    \setmainfont{Humor-Sans}

    \begin{document}
    \begin{tikzpicture}
    \pgfplotsset{every axis/.append style={line width=1pt}}

    \begin{axis}[%
        axis x line=bottom,
        axis y line=left,
        xtick={1.2, 2.9, 4.5},
        xticklabels={-3 days, -1 day, 5 minutes},
        yticklabels={}
    ]
    % 1st plot
    \addplot [cyan!80!white, samples=200, domain=0:6] {0.05*rnd+3+(sin(deg(x))^2)/sqrt(x)*exp(-(x-2))};
    % white background for 2nd plot
    \addplot [white, samples=200, domain=0:6,line width=4pt] {0.05*rnd+0.4*x+2+x^2*sin(deg(x))^2*exp(-x)}; 
    % 2nd plot
    \addplot [red!80!white, samples=200, domain=0:6] {0.05*rnd+0.4*x+2+x^2*sin(deg(x))^2*exp(-x)}; 
    \end{axis} 

    \node at (2.7,4.6) {downhill};
    \draw  plot[smooth, tension=.7,line width=2pt] coordinates {(1.2679,5.5206) (1.9454,5.493) (2.4017,4.9261)};

    \end{tikzpicture}

    \end{document}

第一次尝试

答案1

这是本网站上的几个问题的主题,你可以找到许多这种类似人类排版的例子,最著名的是

我怎样才能使我的文档看起来像是由崇拜克苏鲁的疯子写的?

以及稍微相关的

模拟手绘线条

TikZ 双块矩阵

我记得(因为我已经发布了一些答案),但如果我遗漏了明显的答案,请添加更多。

关于答案,您可以使用装饰而不是随机扰动来处理您的图,这样它们就可以由 TikZ 来处理。您还可以使用双线来实现上一行上的白色覆盖。

我没有 Humor Sans 字体,但我使用了另一种类似的字体来直接使用 PDFLaTeX。SO上的小伙伴们有更好的字体替代品:R 中的 xkcd 样式图表

(更新的示例需要 XeLaTeX 或 LuaLaTeX!!)

\documentclass{standalone}
\usepackage{pgfplots}
\usepackage{fontspec}
\setmainfont{xkcd}

\begin{document}

\begin{tikzpicture}[decoration={random steps,segment length=1mm,amplitude=0.2pt}]
\pgfplotsset{every axis/.append style={line width=1pt}}

\begin{axis}[%
axis x line=middle,
axis y line=middle,
xtick={1.2, 2.9, 4.5},
xticklabels={-3 days, -1 day, 5 minutes},
yticklabels={},
every inner x axis line/.append style={-},
every inner y axis line/.append style={-},
decoration={random steps,segment length=5pt,amplitude=0.3pt},decorate,
every tick/.style={thick,black,decorate}
]
\begin{scope}[decoration={random steps,segment length=3pt,amplitude=0.5pt},decorate]
\addplot [cyan!80!white, samples=30, domain=0:6] {3+(sin(deg(x))^2)/sqrt(x)*exp(-(x-2))};
\addplot [white,double=red!80!white, samples=30, domain=0:6,double distance=1.0pt] {0.4*x+2+x^2*sin(deg(x))^2*exp(-x)}; 
\end{scope}
\end{axis}
\draw (1.2679,5.5206) to[bend left] (2.7,4.6) node[below] {downhill};
\begin{scope}[shift={(7cm,3cm)},thick]
\draw[line join=round,decorate] (0.6cm,-0.1cm) arc (45:275:0.4cm) arc (275:410:0.38cm);
\draw[decorate] (0.4cm,-0.9cm)coordinate (n) -- ++(0.1,-1cm) coordinate (a) -- +(-70:1.2cm) (a) --+(-110:1.2cm);
\draw[decorate] (n) -- ++(-5:0.4cm) --+(10:0.5cm);
\draw[decorate] (n) -- ++(-55:0.4cm) --+(2:0.5cm);
\node[align=left,scale=0.5] (c) at (0.5,2){I WON'T EVEN TRY \\TO BE FUNNY LIKE XKCD};
\draw[thin] (c) to[in=110,out=-90] ++(0,-0.5cm) node[below,align=left,scale=0.5] 
(d) {BUT THEN AGAIN, WHADDA\\ HELL! A NEUTRINO GOES \\TO A BAR...};
\draw[thin] (d) to[in=80,out=-90] ++(0,-1cm);
\end{scope}

\end{tikzpicture}

\end{document}

ba dum tss......

如果删除范围并向轴环境提供装饰选项,您也可以将装饰的有效性扩展到轴。

编辑 :增加了一些关于轴的说明和一些奖励内容

编辑2:切换到更好的字体。


最后,我认为不是波浪线或卡通化的表现,而是作者的冷幽默让它们如此有趣,所以我认为这不会让任何东西更接近韓國

答案2

如果使用创建图matplotlib(python)是一个选项,看看“XKCDify”(抱歉,这不是“TeX 答案”,但在 TeX 文档中包含 matplotlib 生成的图表是很常见的,我认为值得在这里提一下)。

在此处输入图片描述

答案3

我需要这样的东西,并受到上一个答案的启发。我尝试清理代码并使其易于使用,作为单个xkcd axis

单个选项改变所有样式:

有或没有选项的样例图

以下是代码:

\documentclass{standalone}
\usepackage{pgfplots}
  \usepgflibrary{arrows.meta}

\usepackage{emerald}


\pgfplotsset{
  xkcd/.style={
    decoration={
      name=random steps,
      segment length=2pt,
      amplitude=0.3pt,
    },
    line width=1pt,
    line join=round,
    line cap=round,
    decorate,
  },
}
\pgfplotsset{
  xkcd axis/.style={%
    axis on top,
    xkcd,
    every non boxed x axis/.style={
      xtick align=center,
      enlarge x limits=true,
      x axis line style={-Straight Barb[round]}
    },
    every non boxed y axis/.style={
      ytick align=center,
      enlarge y limits=true,
      y axis line style={-Straight Barb[round]}
    },
    every tick/.append style={
      black,
      xkcd,
    },
    every axis plot post/.append style={
      double= . ,
      mark=none,
      draw=white,
      double distance=1pt,
    },
    every axis legend/.append style={
      xkcd,
    },
    tick label style={/pgf/number format/assume math mode=true},
    execute at begin axis={\ECFAugie},
  },
}


\begin{document}

\begin{tikzpicture}
  \begin{axis}[%
    xkcd axis,
    axis x line=bottom,
    axis y line=left,
    xtick={1.2, 2.9, 4.5},
    xticklabels={-3 days, -1 day, 5 minutes},
    xlabel=time,
    ylabel={what is this, exactly ?},
    ]
    \addplot +[samples=30, domain=1:6] {3+(sin(deg(x))^2)/sqrt(x)*exp(-(x-2))};
    \addlegendentry{Hello}
    \addplot +[samples=30, domain=1:6] {0.4*x+2+x^2*sin(deg(x))^2*exp(-x)}; 
    \addlegendentry{World}
  \end{axis}
\end{tikzpicture}
\begin{tikzpicture}
  \begin{axis}[%
    %xkcd axis,
    axis x line=bottom,
    axis y line=left,
    xtick={1.2, 2.9, 4.5},
    xticklabels={-3 days, -1 day, 5 minutes},
    xlabel=time,
    ]
    \addplot +[samples=30, domain=1:6] {3+(sin(deg(x))^2)/sqrt(x)*exp(-(x-2))};
    \addlegendentry{Hello}
    \addplot +[samples=30, domain=1:6] {0.4*x+2+x^2*sin(deg(x))^2*exp(-x)}; 
    \addlegendentry{World}
  \end{axis}
\end{tikzpicture}

\end{document}

答案4

有点晚了,但我刚刚玩了一下,创建了一个类似 xkcd 的 TikZ 装饰。我可能把它添加到了错误的问题上。它是这里. 下面举个例子。

示例改编自 matplotlib

相关内容