PGFplots:提取坐标,用动态名称分配给全局

PGFplots:提取坐标,用动态名称分配给全局

我想循环遍历节点,提取它们在轴坐标系中的坐标,并将它们分配给动态命名的宏。(这是

按照此回答,我定义了一个函数\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。只需让 TiZ 计算坐标(相对于原点)并将其标准化为(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}

在此处输入图片描述

相关内容