修复给定的情节

修复给定的情节

我试图形象化地展示函数第一象限曲线下的面积,比如 f(x) = 6-2x。

\documentclass[border=5mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.13}
\usepgfplotslibrary{fillbetween}

\begin{document}
\begin{tikzpicture}
\begin{axis}[axis equal,
    axis lines=middle,
    xtick={3},
    ytick={6},
    domain=0:3,
    ]
\addplot[name path=f, samples=400, blue] {6-2*x};
\addplot[name path=g, samples=400, draw=none] {0};
\addplot [color=blue!20] fill between[of=f and g, soft clip={domain=0:3}];
\end{axis}
\end{tikzpicture}

\end{document}

此代码产生

在此处输入图片描述

照原样,但如果我注释掉axis equal,,我就会得到

在此处输入图片描述

这更接近期望的行为。

为什么不能填充与轴相等的位置关系?

答案1

因此,我认为这是 PGFPlots 中的一个错误。对于您的特定示例,实际上还有另一种方法可以实现与 rescale 相同的效果,但除此之外,更改属性似乎unit vector ratio通常会破坏fill between

修复给定的情节

首先,为了解决你的特定情节,你可以使用\closedcycle允许您填充到水平轴的命令。请注意,\closedcycle绘制一个关闭形状,因此顶部、底部和侧面都有边缘,这可能并不总是理想的(在这种情况下,您可能更喜欢fill between)。或者,可以使用以下方法分别绘制填充和所需的边缘:

\addplot [draw=blue] {f(x)};
\addplot [draw=none, fill=blue, fill opacity=0.2]
         {f(x)} \closedcycle;

尽管现在情况变得有些复杂。

幸运的是,在这种情况下,这一切都可以避免,因为只要使用以下命令在顶部绘制两个轴,它们就可以非常方便地隐藏所有内容axis on top

\documentclass[border=5mm, tikz]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.14}
\usepgfplotslibrary{fillbetween}

\begin{document}
\begin{tikzpicture}
  \begin{axis}[
      axis lines=middle,
      axis on top,
      axis equal,
      ytick={6},
      xtick={3},
      samples=400,
      domain=0:3,
    ]
    \addplot [
      draw=blue,
      fill=blue,
      fill opacity=0.2
    ] {6-2*x} \closedcycle;
  \end{axis}
\end{tikzpicture}
\end{document}

请注意,要在两点之间画一条直线,通常更容易使用:

\addplot [...] coordinates {
    (0, 6)
    (3, 0)
  } \closedcycle;

两种选择都能达到相同的效果:

输出 1

错误fill between

现在讨论填充问题。这axis equal相当于设置

unit vector ratio={1 1 1},
unit rescale keep size=true,

事实证明,问题出在 上unit vector ratio。有些比率工作正常,但其他一些比率似乎不起作用。因此,在上一个示例中添加两个图并测试fill between

\documentclass[border=5mm, tikz]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.14}
\usepgfplotslibrary{fillbetween}

\begin{document}
\begin{tikzpicture}
  \begin{axis}[
      axis lines=middle,
      axis on top,
      % axis equal,
      unit vector ratio={2 1 1},
      ytick={6},
      xtick={3},
      samples=400,
      domain=0:3,
    ]

    \addplot [
      draw=blue,
      fill=blue,
      fill opacity=0.2
      ] coordinates {
        (0, 6)
        (3, 0)
      } \closedcycle;

    \addplot [
      name path=f,
      draw=red,
    ] {x^2 / 1.5 + sin(360 * x)};
    \addplot [
      name path=g,
      draw=black,
    ] {x^2 / 1.5};

    \addplot [color=red!20] fill between [
      of=f and g,
      soft clip={domain=0:3}
    ];
  \end{axis}
\end{tikzpicture}
\end{document}

根据单位比率的值或所使用的样本数量生成以下内容之一。

输出 2:不工作 输出 2:正在工作

这似乎是 PGFPlots 中的一个错误,并且已经被报告斯蒂芬·平诺在:

#139 [fillbetween] 密集点的数值问题

相关内容