请耐心等待,这有点复杂。我在尝试回答时遇到了一些奇怪的事情这个问题很好. 从 MWE 开始
\documentclass[tikz,border=3.14mm]{standalone}
%\usetikzlibrary{intersections}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\usepgfplotslibrary{fillbetween}
\begin{document}
\begin{tikzpicture}
\begin{axis}[axis equal]
\addplot[thick,samples=80,name path global=duck] {(-3)*x/abs(x)^(2/3)}; % From https://tex.stackexchange.com/a/144463/152550
\addplot[thick,samples=80,name path global=koala] ({sqrt(16/3)*cos((x) r)}, {sqrt(16)*sin((x) r)});
\path (0,0) coordinate (O) (1,0) coordinate(X);
\fill[red,name intersections={of=duck and koala,by={i1,i2}}]
(i1) circle (2pt) (i2) circle (2pt);
\end{axis}
\end{tikzpicture}
\end{document}
到目前为止一切顺利。但是,如果仅通过向下移动来激活\usetikzlibrary{intersections}
和停用,则会收到错误\usepgfplotslibrary{fillbetween}
%
! Package pgf Error: No shape named intersection-2 is known.
这告诉我们找不到第二个交点。如果我们坚持这样做,但注释掉[axis equal]
,错误就会消失,即找到第二个交互。这是怎么回事?
甚至,如果将交点的确定移出轴环境,
\documentclass[tikz,border=3.14mm]{standalone}
%\usetikzlibrary{intersections}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\usepgfplotslibrary{fillbetween}
\begin{document}
\begin{tikzpicture}
\begin{axis}[axis equal]
\addplot[thick,samples=80,name path global=duck] {(-3)*x/abs(x)^(2/3)}; % From https://tex.stackexchange.com/a/144463/152550
\addplot[thick,samples=80,name path global=koala] ({sqrt(16/3)*cos((x) r)}, {sqrt(16)*sin((x) r)});
\path (0,0) coordinate (O) (1,0) coordinate(X);
\end{axis}
\fill[red,name intersections={of=duck and koala,by={i1,i2}}]
(i1) circle (2pt) (i2) circle (2pt);
\end{tikzpicture}
\end{document}
一个人
这意味着交点不正确。另一方面,计算轴外的交点是一种常见的做法,例如这个很好的答案。请注意,即使axis equal
在最后一个例子中删除一个,交叉点仍然不正确。
答案1
计算坐标的坐标不匹配的原因是 pgfplots 中的一个错误。
根本原因在 pgfplots 手册的“4.26 TikZ 互操作性”部分中有解释:pgfplots 重新缩放和平移坐标系。Pgfplots 尽力向最终用户隐藏此重新缩放。例如,轴内的命名坐标在离开轴后会自动重新缩放,以便您可以在之后引用它们\end{axis}
。命名路径的坐标不存在此功能。
一种解决方法是确保坐标系匹配,即禁用 pgfplots 的重新缩放功能。
手册的上述部分对此进行了解释。应用到您的示例中,这可能看起来像
\documentclass[tikz,border=3.14mm]{standalone}
%\usetikzlibrary{intersections}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\usepgfplotslibrary{fillbetween}
\begin{document}
\begin{tikzpicture}
\begin{axis}[axis equal,
disabledatascaling,
anchor=origin,
x=1cm,y=1cm,
]
\addplot[thick,samples=80,name path=duck] {(-3)*x/abs(x)^(2/3)};
\addplot[thick,samples=80,name path=koala] ({sqrt(16/3)*cos((x) r)}, {sqrt(16)*sin((x) r)});
\path (0,0) coordinate (O) (1,0) coordinate(X);
\end{axis}
\fill[red,name intersections={of=duck and koala,by={i1,i2}}]
(i1) circle (2pt) (i2) circle (2pt);
\end{tikzpicture}
\end{document}
但这可能会影响像这样的重新缩放功能axis equal
。
但同样:这不能开箱即用的原因实际上是一个错误:pgfplots 在离开时不会翻译命名路径的坐标\end{axis}
。
答案2
这很可能是因为 PGFPlots 使用了比 PGF 更新的库版本intersections
,因此它与该库类似external
(比较https://tex.stackexchange.com/a/341662/95441)。为了支持这一点,您可以对两个文件进行差异分析
pgflibraryintersections.code.tex
pgfplotsoldpgfsupp_pgflibraryintersections.code.tex