具有预定义坐标的 pgfplot addplot

具有预定义坐标的 pgfplot addplot

我有一堆预定义的坐标,我想通过重复使用坐标在一个图中绘制多条线。如果我更改坐标值,我只想更改一次,而不是在多个坐标列表中更改。因此我想做类似下面的事情

\documentclass[tikz]{standalone}

\usepackage{tikz,pgfplots}
\pgfplotsset{compat=1.9}

\begin{document}
\begin{tikzpicture}

\begin{axis}
\coordinate (p1) at (1,1);
\coordinate (p2) at (2,2);
\addplot coordinates{(p1)(p2)};
\end{axis}

\end{tikzpicture}
\end{document}

生成如下内容

但显然生活不会那么简单,因为我得到了以下错误

Runaway argument?
p1)(p2)\pgfplots@EOI \pgfplotsscanlinelengthcleanup 
\pgfplots@coord@stream@end 
\ETC.
Paragraph ended before \pgfplots@loop@next was complete.
<to be read again> 
               \par 
l.15 

我也尝试过在轴环境之外定义坐标,但是也不起作用。

关于如何在 \addplot 坐标列表中使用预定义坐标有什么想法吗?

答案1

正如我所提到的,这可能是因为 pgfplots 延迟了它的扩展。这样就可以自动放大到相关区域等等。因此我无法为您提供一个完美的解决方案。我能想到的最佳解决方法是

\documentclass[tikz]{standalone}
\makeatletter
% from https://tex.stackexchange.com/q/56353/121799
\newcommand{\gettikzxy}[3]{%
  \tikz@scan@one@point\pgfutil@firstofone#1\relax
  \global\edef#2{\the\pgf@x}%
  \global\edef#3{\the\pgf@y}%
}
\newcommand{\gettikzcoordinates}[2]{%
  \tikz@scan@one@point\pgfutil@firstofone#1\relax
  \pgfmathsetmacro{\myx}{round(0.99626*\the\pgf@x/0.0283465)/1000}
  \pgfmathsetmacro{\myy}{round(0.99626*\the\pgf@y/0.0283465)/1000}
  \global\edef#2{(\myx,\myy)}%
}
\makeatother
\usepackage{tikz,pgfplots}
\pgfplotsset{compat=1.9}

\begin{document}
\begin{tikzpicture}
\coordinate (p1) at (1,1);
\coordinate (p2) at (2,2);
\begin{axis}
\gettikzcoordinates{(p1)}{\Pone}
\gettikzcoordinates{(p2)}{\Ptwo}
\addplot coordinates{\Pone\Ptwo};
\end{axis}
\end{tikzpicture}
\end{document}

此代码生成所需的图。如您所见,如果将 移到语句\begin{axis}之前\coordinate,您将收到错误,主要是因为在需要时未定义坐标。很多时候您可以使用 来解决问题\edef\temp{<something>}\temp,但在这种情况下,我只会陷入无限循环。(\gettikzxy此处与 无关,我只是想指出我从哪里得到了如何提取坐标的想法。)

相关内容