我想循环遍历节点,提取它们在轴坐标系中的坐标,并将它们分配给动态命名的宏。(这是这和这。
按照此回答,我定义了一个函数\Getxycoords
,它检索节点的轴 cs 中的坐标,并将其分配给全局宏。
我希望能够循环对几个点执行此操作。
在 MWE 中,我定义了三个节点 da、db 和 dc。我想使用循环将它们的坐标(在轴系统中)存储为 \Xa、\Ya、\Xb、\Yb、\Xc、\Yc。不幸的是,我不知道如何将动态全局名称作为第二和第三个参数传递给\Getxycoords
函数
% used PGFPlots v1.16
\documentclass[
%border=5pt,varwidth
]{article}
\usepackage{pgfplots}
\pgfplotsset{ compat=1.16}
\usetikzlibrary{intersections}
% ---------------------------------------------------------------------
% Coordinate extraction (from tex.stackexchange.com/questions/420498/extract-convert-store-and-reuse-x-y-coordinate-components/426245#426245)
% #1: node name
% #2: output macro name: x coordinate
% #3: output macro name: y coordinate
\newcommand{\Getxycoords}[3]{%
\pgfplotsextra{%
% using `\pgfplotspointgetcoordinates' stores the (axis)
% coordinates in `data point' which then can be called by
% `\pgfkeysvalueof' or `\pgfkeysgetvalue'
\pgfplotspointgetcoordinates{(#1)}%
% `\global' (a TeX macro and not a TikZ/PGFPlots one) allows to
% store the values globally
\global\pgfkeysgetvalue{/data point/x}{#2}%
\global\pgfkeysgetvalue{/data point/y}{#3}%
}%
}
% ---------------------------------------------------------------------
\begin{document}
\begin{tikzpicture}
\begin{axis}[xmin=0,xmax=80,ymin=0,ymax=80]
\pgfplotsforeachungrouped \i/\j in {
1 / a,
2 / b,
3 / c
}{
\edef\temp{%
\noexpand%
\node [circle,inner sep=2pt,circle,fill,label=above:\j] (d\j) at (axis cs:\i*10,\i*20+5) {};%
}
\temp
}
\pgfplotsforeachungrouped \j in { a, b, c}{
\Getxycoords{d\j}{\X\j}{\Y\j};
}
\end{axis}
\node[below] (test) at (dc) {\Xc};
\end{tikzpicture}
\end{document}
结果是! Package pgf Error: No shape named dc is known.
我也试过
\pgfplotsinvokeforeach{a, b, c}{
\Getxycoords{d#1}{\X#1}{\Y#1};
}
得出:(
! Package pgf Error: No shape named da is known.
对于 db 和 dc 也是如此。)
我猜这与事物是否扩展有关,但我对这个问题完全感到困惑。
答案1
这里有一个建议,可以提取任何对象的坐标,无论这是否是 pgfplots axis
。只需让 Ti钾Z 计算坐标(相对于原点)并将其标准化为(1,1)
相对于原点的点的坐标。 (我还定义了\Xc
等。)
\documentclass[
%border=5pt,varwidth
]{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\usetikzlibrary{intersections,calc}
\begin{document}
\begin{tikzpicture}
\begin{axis}[xmin=0,xmax=80,ymin=0,ymax=80]
\pgfplotsforeachungrouped \i/\j in {
1 /a,
2 /b,
3 /c
}{
\edef\temp{%
\noexpand\node [circle,inner sep=2pt,circle,fill,label=above:\j,alias={d\j}] (d\j) at (axis cs:\i*10,\i*20+5) {};%
}
\temp
}
\coordinate (O) at (0,0);
\coordinate (X) at (1,1);
\end{axis}
\pgfplotsforeachungrouped \j in { a, b, c}{
\path let \p1=($(d\j.center)-(O)$),\p2=($(X)-(O)$),\n1={\x1/\x2},\n2={\y1/\y2} in
\pgfextra{\pgfmathparse{\n1}
\xdef\X{\pgfmathresult}
\pgfmathparse{\n2}
\xdef\Y{\pgfmathresult}};
\typeout{\X,\Y}
\expandafter\xdef\csname X\j\endcsname{\X}
\expandafter\xdef\csname Y\j\endcsname{\Y}
}
\node[below] (test) at (dc) {\Xc};
\end{tikzpicture}
\end{document}