У меня есть набор предопределенных координат, где я хочу нарисовать несколько линий на графике, повторно используя координаты. Если я изменю значение координат, я хочу изменить его только один раз, а не в нескольких списках координат. Поэтому я хочу сделать что-то вроде следующего
\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
здесь не имеет значения, я просто хотел указать, откуда я взял идею, как извлечь координаты.)