Pgfplot 和在特定点采样

Pgfplot 和在特定点采样

我正在尝试了解如何使用pgfplots 中的samples at选项...。考虑 MWE

\documentclass{standalone}

\usepackage{pgfplots}
\pgfplotsset{compat=newest}

\begin{document}
\begin{tikzpicture}[line/.style={black, thick},
  declare function={foo(\x) =
    max(0, 4 + min(0, (\x-4)^3));
  },]
  \begin{axis}[xmin=-1, xmax=6, axis on top]
    \addplot[line, color=black, domain=-1:6]{foo(x)};
    \addplot[line, color=blue, samples at={-1, 2.4125, 4, 6}]{foo(x)};
    \addplot[line, color=red, samples at={-1, 2.4125,...,4, 6}]{foo(x)};
    \addplot[line, color=green, samples at={-1, ...,2.4125,...,4, ...,6}]{foo(x)};
  \end{axis}
\end{tikzpicture}
\end{document}

平均能量损失

不使用 lint 绘制samples at会产生伪影,这是由于中间区域的点采样不足造成的。第二个addplot

\addplot[line, color=blue, samples at={-1, 2.4125, 4, 6}]{foo(x)};

通过在提供的位置添加特定的采样点来按预期工作。

然而,第三addplot

\addplot[line, color=red, samples at={-1, 2.4125,...,4, 6}]{foo(x)};

不起作用。我期望它添加更多范围 [2.4125,4] 内的样本,但它却做了一些奇怪的事情。最后,最后一个addplot

\addplot[line, color=green, samples at={-1, ...,2.4125,...,4, ...,6}]{foo(x)};

我希望产生类似于该图的结果,除了samples at2.4125、4 和 6 处的额外点之外。相反,这条线似乎循环了一遍!

我怀疑我使用不当samples at,但我不确定如何纠正我的用法。

答案1

您应该指定步骤来填充列表。否则它将被设置为 1。这是来自 pgfmanual。

通常,当遇到列表项 ... 时,它之前应该已经有两个列表项,即数字。数字的示例有 1、-10 或 -0.24。我们把这些数字称为 x 和 y,并让 d := y − x 为它们的差值。接下来,三个点后面还应该有一个数字,我们把这个数字称为 z。

在这种情况下,列表中“x,y,...,z”的部分被替换为“x, x + d, x + 2d, x + 3d, ..., x + md”,其中最后的点是语义点,而不是句法点。m 值是最大数,如果 d 为正数,则 x + md ≤ z,如果 d 为负数,则 x + md ≥ z。

也许最好通过一些例子来解释这一点:以下具有相同的效果:

\foreach \x in {1,2,...,6} {\x, } 得出 1, 2, 3, 4, 5, 6,

\foreach \x in {1,2,3,...,6} {\x, } 得出 1, 2, 3, 4, 5, 6,

\foreach \x in {1,3,...,11} {\x, } 得出 1, 3, 5, 7, 9, 11,

\foreach \x in {1,3,...,10} {\x, } 得出 1, 3, 5, 7, 9,

\foreach \x in {0,0.1,...,0.5} {\x, } 得出 0, 0.1, 0.20001, 0.30002, 0.40002,

\foreach \x in {a,b,9,8,...,1,2,2.125,...,2.5} {\x, } 得出 a, b, 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, 2.125, 2.25, 2.375, 2.5

可以看出,对于一些较小的 n,如果小数步长不是 2−n 的倍数,则很容易出现舍入误差。因此,在倒数第二个例子中,出于稳健性考虑,0.5 可能应该被 0.501 取代。

... 语句还有另一种特殊情况:如果 ... 紧接着列表中的第一个项目使用,即如果存在 x,但没有 y,则差异 d 显然无法计算,并且如果点后的数字 z 大于 x,则将其设置为 1,如果 z 小于 x,则将其设置为 −1。

因此,如果您想要从 -1 到 2.4125 到 4 到 6 的样本,您可以编码

\addplot[line, color=cyan, samples at={-1,-.5,...,2.4125, 2.5,2.8,...,4, 4,4.6,...,6}]{foo(x)};

我们从 -1 开始,以 0.5 为增量到 2.4125,然后以 0.3 为增量从 2.5 到 4,再以 0.6 为增量从 4 到 6。

您可以比较

\addplot[line, color=black, domain=-1:6, samples=100]{foo(x)};

相关内容