以下代码在引入该foreach
部分时会导致错误。所以,我想知道其中有什么问题。
\documentclass[border=1cm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest,
poles/.style= { only marks, mark=x, mark size = 1ex, thick},
zeros/.style= { only marks, mark=o, mark size = 1ex, thick }
}
\begin{document}
\begin{tikzpicture}
\begin{axis}[axis lines=middle,
xmax = 1, xmin = -8,
xtick={1,...,-9},
ymax = 2, ymin = -2,
ytick={-2,...,2},
]
\addplot[poles] coordinates {(-2,2) (-2,-2) (-8,0)};
\addplot[zeros] coordinates {(-4,0)};
\foreach \x/\y in {-2/2 , -2/-2 , -8/0 , -4/0 }{
\node[label={180:{(\x,\y)}},inner sep=2pt] at (axis cs:\x,\y) {};
}
\end{axis}
\end{tikzpicture}
\end{document}
此外,如何删除foreach
代码并将其替换为内部坐标标记的全局设置,pgfplotsset
并使用角度放置的局部输入选项代替180
我的代码中提供的固定角度?
答案1
是的,这是 pgfplots 中一个众所周知的扩展问题。根据人们的看法,人们可能会认为你的问题与导致这个答案。如果您觉得这是重复的,我很乐意删除此答案。否则就这样做
\documentclass[border=1cm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest,
poles/.style= { only marks, mark=x, mark size = 1ex, thick},
zeros/.style= { only marks, mark=o, mark size = 1ex, thick }
}
\begin{document}
\begin{tikzpicture}
\begin{axis}[axis lines=middle,clip=false,%<-added
xmax = 1, xmin = -8,
xtick={1,...,-9},
ymax = 2, ymin = -2,
ytick={-2,...,2},
]
\addplot[poles] coordinates {(-2,2) (-2,-2) (-8,0)};
\addplot[zeros] coordinates {(-4,0)};
\foreach \x/\y/\z in {-2/2/-90 , -2/-2/90 , -8/0/90 , -4/0/90 }{
\edef\temp{\noexpand\node[label={\z:{(\x,\y)}},inner sep=2pt] at (axis
cs:\x,\y) {};}
\temp
}
\end{axis}
\end{tikzpicture}
\end{document}
为什么这是必要的? pgfplots 在实际排版之前会运行一个“调查阶段”。在这个阶段,它可以在某种程度上忘记循环内的内容,因为还有另一个扩展魔法在发生。出于这个原因,pgfplots 带有自己的循环机制,如\pgfplotsinvokeforeach
和\pgfplotsforeachungrouped
,有关更多详细信息,请参阅手册第 8.1 节。我个人的底线是先尝试上述技巧,如果它有效,那么我就没问题了。;-)
附录:这是一个丑陋的版本,允许您通过 point meta 添加锚点。(我现在没有太多时间。)它可以工作,但您只能在0
和之间放置锚点360
,也就是说,说-90
不起作用。而且有一个空图。原因是我现在没有时间去找出如何进行更好的\pgfplotspointmetatransformed
转换。
\documentclass[border=1cm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest,
poles/.style= { scatter,
scatter src=explicit, only marks, mark=x, mark size = 1ex, thick},
zeros/.style= { scatter,
scatter src=explicit, only marks, mark=o, mark size = 1ex, thick }
}
\newcommand\myparse[1]{\pgfmathparse{#1}\typeout{\pgfmathresult}}
\begin{document}
\begin{tikzpicture}
\begin{axis}[axis lines=middle,clip=false,%<-added
xmax = 1, xmin = -8,
xtick={1,...,-9},
ymax = 2, ymin = -2,
ytick={-2,...,2},
visualization depends on=x \as \rawx,
visualization depends on=y \as \rawy,
visualization depends on=\pgfplotspointmetatransformed \as \mymeta,
nodes near coords style={
anchor=(\pgfplotspointmetatransformed/1000)*360
},
nodes near coords={(\pgfmathprintnumber{\rawx},\pgfmathprintnumber{\rawy})},
]
\addplot[poles,forget plot,opacity=0] coordinates {(0,0)[0] (0,0)[360]};
\addplot[poles] coordinates {(-2,2)[90] (-2,-2)[270] (-8,0)[0]};
\addplot[zeros] coordinates {(-4,0)[270]};
\end{axis}
\end{tikzpicture}
\end{document}