たくさんの座標があらかじめ定義されており、座標を再利用してプロットに複数の線を描きたいと考えています。座標値を変更する場合は、複数の座標リストではなく、1回だけ変更する必要があります。したがって、次のようなことをしたいのです。
\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
ここでは関係ありません。座標を抽出する方法をどこから得たかを示したかっただけです。)