有一些关于如何使用绘制曲线下面积的问题pgfplots
。但据我所知,所有答案都有一个共同点,即必须使用不同的样式选项绘制两次函数。例如,Pgfplots:如何用斜线(阴影)作为图案填充曲线下的区域?
这也是我目前的做法。下面是一个简单的示例:
\begin{tikzpicture}[/pgf/declare function={f=1-exp(-x*x);}]
\begin{axis}[axis x line=center]
\addplot [domain=-2:2, samples=500, red, fill] {f} \closedcycle;
\addplot [domain=-5:5, samples=500] {f};
\end{axis}
\end{tikzpicture}
但特别是如果有许多具有非平凡函数的图(需要大量样本才能看起来很流畅!)这可能会导致较长的编译时间。
仅仅设置区域填充图的样本通常是不够的,因为由于图的粗糙采样,一些区域会“悬垂”在曲线的错误一侧。
是否只需绘制一次函数就能实现相同的输出,从而显著减少编译时间?
答案1
pgfplots 1.10 版刚刚发布,它提供了一种新的解决方案,以“编译时优化的方式”填充图表之间的区域。
\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.10}
\usepgfplotslibrary{fillbetween}
\begin{document}
\begin{tikzpicture}[/pgf/declare function={f=1-exp(-x*x);}]
\begin{axis}[axis x line=center]
\addplot [name path=f,domain=-5:5, samples=500] {f};
\path[name path=axis] (axis cs:\pgfkeysvalueof{/pgfplots/xmin},0) -- (axis cs:\pgfkeysvalueof{/pgfplots/xmax},0);
\addplot[gray!50] fill between[of=f and axis];
\end{axis}
\end{tikzpicture}
\end{document}
该解决方案依赖于\usepgfplotslibrary{fillbetween}
:它分配name path=f
给感兴趣的函数。这是编译时优化的:它将使用此函数的低级软路径。然后,它定义一个\path
(既不绘制也不填充),它类似于 x 轴(并接收name path=axis
。最后,\addplot fill between
填充下的区域f and axis
,仅依赖于编译时优化的表示。事实上,这个填充操作只是连接f
和axis
(并计算结果边界框)。因此,它应该很快。并且:它具有与大致相同的效果\closedcycle
(除了它填充在 xmin 和 xmax 之间,这可能大于输入数据范围)。