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, но в этой ситуации я только попал в бесконечные циклы. (The \gettikzxyздесь не имеет значения, я просто хотел указать, откуда я взял идею, как извлечь координаты.)

Связанный контент