我试图形象化地展示函数第一象限曲线下的面积,比如 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;
两种选择都能达到相同的效果:
错误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}
根据单位比率的值或所使用的样本数量生成以下内容之一。
这似乎是 PGFPlots 中的一个错误,并且已经被报告斯蒂芬·平诺在: