Eu tenho um monte de coordenadas predefinidas, onde quero desenhar várias linhas em um gráfico reutilizando as coordenadas. Se eu alterar um valor de coordenada, só quero alterá-lo uma vez, e não em várias listas de coordenadas. Portanto, quero fazer algo como o seguinte
\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}
Para gerar algo parecido com isto
Mas aparentemente a vida não pode ser tão fácil, porque recebo o seguinte erro
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
Tentei definir as coordenadas fora do ambiente do eixo também, mas também não funcionou.
Alguma idéia de como usar coordenadas predefinidas em uma lista de coordenadas \addplot?
Responder1
Como mencionei, isso provavelmente ocorre porque o pgfplots atrasa suas expansões. Desta forma é possível ampliar automaticamente a região relevante e assim por diante. Portanto, não posso oferecer-lhe uma solução bonita. A melhor solução alternativa que consegui produzir é
\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}
Este código produz o gráfico desejado. Como você pode verificar, se você mover \begin{axis}
antes das \coordinate
instruções, obterá um erro, essencialmente porque as coordenadas não foram definidas quando são necessárias. Muitas vezes você consegue escapar usando \edef\temp{<something>}\temp
, mas nessa situação eu só fiquei preso em loops infinitos. (O \gettikzxy
não é relevante aqui, só queria indicar de onde tirei a ideia de como extrair as coordenadas.)