\draw 通过 \pgfplotstableforeachcolumnelement 在 {axis} 环境之外失败,但在内部可以工作?

\draw 通过 \pgfplotstableforeachcolumnelement 在 {axis} 环境之外失败,但在内部可以工作?

考虑一下这个MWE:

\documentclass{article}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usetikzlibrary{calc}

\pgfplotstableread[col sep=space,row sep=newline,header=true]{
ts   val
0.0  0.0
1.0  1.0
1.1  4.9
2.0  2.0
2.2  4.9
4.8  0.2
}\mytable

\def\drawLines{%
  \pgfplotstableforeachcolumnelement{[index]0}\of\mytable\as\cx{%
    % \node{I have now cell element ‘\cx’ at row index ‘\pgfplotstablerow’;\par};
    \edef\temp{ %
      \noexpand\draw[%
        draw=black,%
        fill=none,%
        opacity=0.7,%
      ] let \noexpand\p1=({axis cs:\cx,0}), \noexpand\p2=({rel axis cs:0,0}),
        \noexpand\p3=({rel axis cs:1,1}) in
        (\noexpand\x1,\noexpand\y2) -- (\noexpand\x1,\noexpand\y3)
      ; %
    }
    \temp
  }
}

\begin{document}
\begin{tikzpicture}
  \begin{axis}[extra x ticks={3.5}]
\addplot[smooth] table {\mytable};
\addplot[only marks,mark=*,mark options={color=blue}] table {\mytable};
\draw[red] let \p1=(rel axis cs:0,0), \p2=(rel axis cs:1,1), \p3=(axis cs:3.5,0)
  in (\x3,\y1) -- (\x3,\y2);
\drawLines % passes no problem
\end{axis}
\drawLines % fails w/ "! Missing \endcsname inserted." \pgfcrdmth@x
\end{tikzpicture}
\end{document}

事实上,它将会失败:

! Missing \endcsname inserted.
<to be read again> 
                   \pgfcrdmth@x 
l.42 \drawLines
                % fails w/ "! Missing \endcsname inserted." \pgfcrdmth@x

...但是如果你注释掉标有 - 的行% fails...,那么文档就可以成功编译,并且符合预期?显然,通过\drawLines调用的函数,\draw\pgfplotstableforeachcolumnelement工作 - 但只能从内部进行{axis},而不是从外部进行?

为什么会发生这种情况 - 我怎样才能让这个宏在 之外执行{axis},同时仍在 中{tikzpicture}? 否则我怎么知道哪段代码可以从哪里运行?

PS: 事实上,这看起来像为什么 \foreach 变量在 \axis 中的 \draw 中不起作用?,但我猜这个问题可以用我在这里使用的 \edef\temp...\temp 来回答;这就是为什么这个问题让我困惑...

答案1

与轴相关的命令pgfplots仅在轴环境中有意义。为了能够访问绘图中的重要部分,您需要用坐标或节点标记它们之内轴环境,然后可以从同一个 TikZ 图片的外部访问它们。

对于轴的角和类似的相当明显的部分,您可以标记轴并引用其角,就像使用常规 TikZ 节点一样。

\begin{tikzpicture}
\begin{axis}[name=myaxis]
  ....
\end{axis}
\draw[red,thick] (myaxis.south) -- (myaxis.north);
\end{tikzpicture}

在此处输入图片描述

相关内容