我正在尝试在绘图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
,因此看起来 和 之间出现了问题pgfplots
。datatool
还是我做错了什么?
答案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}