为什么 datatool/pgfplots 仅绘制表格中的最后一行?

为什么 datatool/pgfplots 仅绘制表格中的最后一行?

我正在尝试在绘图datatool上放置一堆圆圈pgfplots。我尝试了以下操作:

\documentclass{article}
\usepackage{datatool,tikz,pgfplots}
\pgfplotsset{compat=1.9}

\begin{filecontents}{coord.dat}
x,y
0,0
5,5
-3,4
\end{filecontents}

\DTLloaddb[noheader=false]{coordinates}{coord.dat}

\begin{document}
\begin{tikzpicture}
  \begin{axis}[xmin=-10,xmax=10,ymin=-10,ymax=10,axis equal]
        \DTLforeach*{coordinates}{\x=x, \y=y}{\draw (axis cs:\x,\y) circle[radius=2] ;}
  \end{axis}
\end{tikzpicture}
\end{document}

但只绘制了一个圆圈,位于表格最后一行的坐标处(即以 (-3,4) 为中心)。

\DTLforeach*如果我将放入裸环境中,我会得到 3 个圆圈tikzpicture,因此看起来 和 之间出现了问题pgfplotsdatatool还是我做错了什么?

答案1

正如 Percusse 指出的那样,PGFPlots 首先收集所有 TikZ 命令(如\draw),然后在环境的最后执行它们axis,这导致最后一个圆圈被绘制三次:在每次循环迭代期间,将另一个圆圈\draw (axis cs:\x,\y)...添加到命令列表中,并且在最后,当\x和分别\y包含-3和时-4,执行这些 `\draw 命令。

您可以通过将循环包装到以下内容来告诉 PGFPlots 将循环推迟\DTLforeach到环境的末尾:axis\pgfplotsextra

\documentclass{article}
\usepackage{datatool,tikz,pgfplots}
\pgfplotsset{compat=1.9}

\begin{filecontents}{coord.dat}
x,y
0,0
5,5
-3,4
\end{filecontents}

\DTLloaddb[noheader=false]{coordinates}{coord.dat}

\begin{document}
\begin{tikzpicture}
  \begin{axis}[xmin=-10,xmax=10,ymin=-10,ymax=10,axis equal]
        \pgfplotsextra{
            \DTLforeach*{coordinates}{\x=x, \y=y}{\draw (axis cs:\x,\y) circle[radius=2] ;}}
  \end{axis}
\end{tikzpicture}
\end{document}

相关内容