![具有预定义坐标的 pgfplot addplot](https://linux22.com/image/370688/%E5%85%B7%E6%9C%89%E9%A2%84%E5%AE%9A%E4%B9%89%E5%9D%90%E6%A0%87%E7%9A%84%20pgfplot%20addplot.png)
我有一堆预定义的坐标,我想通过重复使用坐标在一个图中绘制多条线。如果我更改坐标值,我只想更改一次,而不是在多个坐标列表中更改。因此我想做类似下面的事情
\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
此处与 无关,我只是想指出我从哪里得到了如何提取坐标的想法。)