Сэтот вопросвозможно, перегружен и содержит слишком много ненужных подробностей, я попытался переформулировать его в более сжатую и содержательную форму.
Проблема в том, что я хочу получить доступ к координатам колчанного графика (x,y,u,v) в собственном фрагменте кода, в quiver/after arrow/.code
, или альтернативно в quiver/before arrow/.code
. Следующий пример не имеет полного смысла, так как можно было бы легко просто изменить значения u и v. Однако проблема точно такая же, как и в моем другом вопросе.
В коде я добавил комментарий, в котором пытаюсь получить доступ к координатам и где закомментированы различные нерабочие возможности.
\documentclass[]{standalone}
\usepackage{tikz,pgfplots}
\usetikzlibrary{calc} \pgfplotsset{compat=newest}
\begin{document}
\begin{tikzpicture}
\begin{axis}[axis equal image,enlargelimits=false,clip=false]
% Reference plot
\addplot[
quiver={
u=x,v=y,
},
->,
samples=5,domain=0:1
] {x*x};
% own plot
\addplot[
quiver={
u=x,v=y,
% draw some other (e.g. orthogonal) arrows here!
after arrow/.code={
\draw[blue,dashed,->] (0.5,0.25) -- ($ (0.5,0.25) + (0.25,-0.5)$);
\draw[blue,dashed,->] (1,1) -- ($ (1,1) + (1,-1)$);
%
%
% Things which are not working
%
%
%\draw[blue,dashed,->] (x,y) -- ($ (x,y) + (v,-u)$);
%\draw[blue,dashed,->] (\x,\y) -- ($ (\x,\y) + (\v,-\u)$);
%\draw[blue,dashed,->] (\pgfplots@current@point@x,\pgfplots@current@point@y) -- ($ (\pgfplots@current@point@x,\pgfplots@current@point@y) + (\pgfplots@quiver@v,-\pgfplots@quiver@u)$);
};
},
draw=none,
samples=5,domain=0:1
] {x*x};
\end{axis}
\end{tikzpicture}
\end{document}
решение1
В настоящее время дизайн quiver
очень негибкий. К моменту рисования стрелок координаты (x,y) сохраняются в \pgf@x
и , \pgf@y
а координаты (u,v) переводятся в абсолютные координаты. У вас нет особого выбора.
Возможно, вы сможете построить одну и ту же функцию дважды, используя разные quiver
.
\documentclass[border=9,tikz]{standalone}
\usepackage{pgfplots}\pgfplotsset{compat=newest}
\begin{document}
\begin{tikzpicture}
\begin{axis}[axis equal]
% Reference plot
\addplot[
quiver={u=x,v=y},
->,
samples=10,domain=0:1
] {x*x};
% own plot
\addplot[
quiver={u=y,v=-x},
->,blue,
samples=10,domain=0:1
] {x*x};
\end{axis}
\end{tikzpicture}
\end{document}
Хрупкий способ доступа к относительным координатам (u,v)
\documentclass[border=9,tikz]{standalone}
\usepackage{pgfplots}\pgfplotsset{compat=newest}
\begin{document}
\makeatletter
\def\pgfplotsplothandlerquiver@vis@path#1{%
% remember (x,y) in a robust way
#1%
\pgfmathsetmacro\pgfplots@quiver@x{\pgf@x}%
\pgfmathsetmacro\pgfplots@quiver@y{\pgf@y}%
% calculate (u,v) in relative coordinate
\pgfplotsaxisvisphasetransformcoordinate\pgfplots@quiver@u\pgfplots@quiver@v\pgfplots@quiver@w%
\pgfplotsqpointxy{\pgfplots@quiver@u}{\pgfplots@quiver@v}%
\pgfmathsetmacro\pgfplots@quiver@u{\pgf@x-\pgfplots@quiver@x}%
\pgfmathsetmacro\pgfplots@quiver@v{\pgf@y-\pgfplots@quiver@y}%
% move to (x,y) and start drawing
{%
\pgftransformshift{\pgfpoint{\pgfplots@quiver@x}{\pgfplots@quiver@y}}%
\pgfpathmoveto{\pgfpointorigin}%
\pgfpathlineto{\pgfpoint\pgfplots@quiver@u\pgfplots@quiver@v}%
}%
}%
\begin{tikzpicture}
\begin{axis}[axis equal]
\addplot[
quiver={u=x,v=y,
after arrow/.code={
\relax{% always protect the shift
\pgftransformshift{\pgfpoint{\pgfplots@quiver@x}{\pgfplots@quiver@y}}%
\node[below right]{\tiny$(u,v)=(\pgfplots@quiver@u,\pgfplots@quiver@v)$};
}
}
},
->,
samples=10,domain=-1:1
] {x*x};
\end{axis}
\end{tikzpicture}
\end{document}
Отказ от ответственности
В настоящее время before arrow
и after arrow
не используется в других местах пакета. Тот факт, что (u,v) находится в абсолютной координате, может быть изменен в будущем.