这是一个后续问题: 广义:访问 TikZ 坐标的逻辑值。
在这个问题中,杰克提出了一个 PGFplot 答案。
我采纳了该答案并将其修改为以下 MWE:
\documentclass{article}
\usepackage{pgfplots}
\usetikzlibrary{intersections}
\newcommand\xcoord[2][center]{{%
\pgfpointanchor{#2}{#1}%
\pgfgetlastxy{\ix}{\iy}%
\pgfplotspointaxisorigin%
\pgfgetlastxy{\ox}{\oy}
\pgfmathparse{(\ix-\ox)/\pgfplotsunitxlength/1000}
\pgfmathprintnumber{\pgfmathresult}}
}
\begin{document}
\vspace{1cm}
\begin{tikzpicture}
\begin{axis}[
domain=1:8.2,
samples=150,
no markers,
axis lines=middle,
enlarge x limits=upper,
enlarge y limits=true,
x axis line style={{name path global=xaxis}}
]
\addplot +[name path global=plot] {(x-2.07)*(x-4.09)*(x-5.72)*(x-8.04)};
\pgfplotsextra{
\fill [name intersections={of=xaxis and plot, name=i, total=\t}]
[red, every node/.style={black}]
(i-1) circle (2pt) node [pin={\xcoord{i-1}}] {}
(i-2) circle (2pt) node [pin={\xcoord{i-2}}] {};
}
\end{axis}
\end{tikzpicture}
\end{document}
这将产生以下内容:
因此坐标偏离了 10 倍。
该如何纠正这个问题呢?我想知道如何通过 foreach 循环访问它们,而不是为每个节点专门创建一个节点。
答案1
嗯,这个宏有些不对劲\pgfplotsunitxlength
。我编写了一个新的宏,\xcoord
它的工作原理是提取绘图点 (0,0) 和 (1,1) 的值并将其用作单位向量。还要注意指向\pgfplotspointorigin
两个轴相交的点,而不是指向点 (0,0),因此该值不仅偏离了 10 倍,而且还偏离了 1。我在下面的代码中使用点 (0,0) 来纠正这个问题。
您可以使用 循环遍历交叉点\foreach \n in {1,...,\t}
,其中\t
是保存 中指定的交叉点总数的宏total=\t
。
如果交点恰好位于图的某个支撑点上,有时会出现两次交点的问题。在这种情况下,您应该domain
稍微调整一下。
\documentclass{article}
\usepackage{pgfplots}
\usetikzlibrary{intersections}
\newcommand\xcoord[2][center]{{%
% The actual point of interest
\pgfpointanchor{#2}{#1}%
\pgfgetlastxy{\ix}{\iy}%
% (0,0)
\pgfplotspointaxisxy{0}{0}%
\pgfgetlastxy{\ox}{\oy}
% (1,1)
\pgfplotspointaxisxy{1}{1}%
\pgfgetlastxy{\ux}{\uy}
\pgfmathparse{(\ix-\ox)/(\ux-\ox)}
\pgfmathprintnumber{\pgfmathresult}}
}
\begin{document}
\vspace{1cm}
\begin{tikzpicture}
\begin{axis}[
xmin=0,
domain=0:8.4,
restrict y to domain=-100:50,
samples=149,
no markers,
axis lines=middle,
enlarge x limits=upper,
enlarge y limits=true,
x axis line style={{name path global=xaxis}}
]
\addplot +[name path global=plot] {(x-2.07)*(x-4.09)*(x-5.72)*(x-8.04)};
\pgfplotsextra{
\fill [name intersections={of=xaxis and plot, name=i, total=\t},
red,
every node/.style={black}]
\foreach \n in {1,...,\t} {
(i-\n) circle (2pt) node [pin={\xcoord{i-\n}}] {}
};
}
\end{axis}
\end{tikzpicture}
\end{document}