无法在 pgfplot 中修饰空路径

无法在 pgfplot 中修饰空路径

我想保存一个图,将其裁剪并在上面放一个箭头

\documentclass[10pt,convert={convertexe=magick,density=1000,outext=.png}]{standalone}

\usepackage{tikz,pgfplots}
\usetikzlibrary{decorations.markings}

\begin{document}

\begin{tikzpicture}

\begin{axis}
\addplot[save path=\test] coordinates {(0,0) (2,3) (5,5)};

\begin{scope}
\clip (axis cs:1,1) rectangle (axis cs:4,4);
% \draw[red][use path=\test];  % <-- THIS WORKS
\draw[red,postaction={decorate},decoration={markings,mark=at position 0.5 with {\arrow{stealth}}}][use path=\test];
\end{scope}

\end{axis}
\end{tikzpicture}

\end{document}

好吧,放箭头不起作用,因为我收到了消息

! Package pgf Error: I cannot decorate an empty path.

有什么方法可以解决这个问题?

提供的解决方案这里不起作用

在此处输入图片描述

答案1

混合过程pgfplotstikz会出现一些无法预料的故障,可能会让粗心大意的人措手不及。

第一个是,它\addplot在调用时不会渲染其路径,而是将其保存起来以备axis环境结束时使用。因此,由 定义的路径在环境结束\addplot后才可用axis。幸运的是,pgfplots轴也会影响正常的 TikZ \draw(和类似)命令,因此这些命令也会在环境结束时收集和处理axis。因此,您在自己的情况下不会注意到这一点,但值得了解。

第二个原因是它还\addplot引入了许多范围,从而引入了 TeX 组,因此本地定义的内容不会超出其组的范围。因此,spath/save需要将上一个答案中的替换为spath/save global以使路径成为全局路径。

第三个是\addplot默认在目录中取其键值pgfplots。因此该spath键需要有其绝对路径,并以 的形式调用/tikz/spath/save global

\documentclass[10pt,convert={convertexe=magick,density=1000,outext=.png}]{standalone}
%\url{https://tex.stackexchange.com/q/650703/86}
\usepackage{tikz,pgfplots}
\usetikzlibrary{decorations.markings,spath3}

\tikzset{
  message/.code={\message{this is message #1^^J}}
}

\begin{document}

\begin{tikzpicture}

\begin{axis}
\addplot[/tikz/message=one,/tikz/spath/save global=test] coordinates {(0,0) (2,3) (5,5)};

\tikzset{message=two,spath/show=test} % path doesn't exist here

\begin{scope}
\clip (axis cs:1,1) rectangle (axis cs:4,4);
\draw[message=three,ultra thick, red,postaction={decorate},decoration={markings,mark=at position 0.5 with {\arrow{stealth}}}][spath/use=test];
\end{scope}

\tikzset{message=four}

\end{axis}
\end{tikzpicture}

\end{document}

上面的代码中包含了关键信息message,以显示事情发生的顺序。在代码中,有四条消息,顺序为onetwothreefour。在日志文件中,它生成:

this is message one
this is message two

Package spath3 Warning: Soft path test doesn't exist on line 17

this is message four
this is message one
this is message three

还要注意的是,test当路径在行中“显示”时,它并不存在\tikzset。它直到环境结束时才被定义axis

答案2

也许最简单的方法就是\addplot在绘制红色剪裁线后使用另一个使用相同坐标列表的方法添加标记。您可以将坐标存储在表中以方便访问:

\documentclass[10pt]{standalone}

\usepackage{tikz,pgfplots}
\usetikzlibrary{decorations.markings}

\pgfplotstableread[row sep=crcr]{
0  0  \\
2  3  \\
5  5  \\
}\plotcoords

\begin{document}

\begin{tikzpicture}

\begin{axis}
\addplot[save path=\test, draw=none] table {\plotcoords};

\begin{scope}
\clip (axis cs:1,1) rectangle (axis cs:4,4);
\draw[red][use path=\test];  
\end{scope}

\addplot[draw=none, postaction={decorate}, decoration={markings,mark=at position 0.5 with {\arrow{stealth}}}] table {\plotcoords};

\end{axis}
\end{tikzpicture}

\end{document}

在此处输入图片描述

相关内容