我想保存一个图,将其裁剪并在上面放一个箭头
\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
混合过程pgfplots
中tikz
会出现一些无法预料的故障,可能会让粗心大意的人措手不及。
第一个是,它\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
,以显示事情发生的顺序。在代码中,有四条消息,顺序为one
、two
、three
和four
。在日志文件中,它生成:
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}