更多:广义:访问 TikZ 坐标的逻辑值

更多:广义:访问 TikZ 坐标的逻辑值

这是一个后续问题: 广义:访问 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} 

pgfplots 交叉点逻辑坐标

相关内容