그래서, 그 이후에는@Symbol1의 뛰어난 솔루션마지막 질문에는 같은 주제에 대한 새로운 질문이 있습니다. \pgfplotsplothandlerquiver@vis@path
의 동작을 변경하는 제안된 코드에서는 point meta
더 이상 작동하지 않는 것 같습니다...
이는 mapped color
및\pgfplotspointmetatransformed
\documentclass[border=9,tikz]{standalone}
\usepackage{pgfplots}\pgfplotsset{compat=newest}
\usetikzlibrary{arrows.meta}
\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[
point meta=x,
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\color{mapped color}\pgfplotspointmetatransformed};
}
}
},
->,
samples=10,domain=-1:1
] {x*x-1};
\addplot[
point meta=x,
quiver={u=x,v=y,
every arrow/.append style={%
-{Latex[scale length={max(0.1,\pgfplotspointmetatransformed/1000)}]},mapped color
},
},
->,
samples=10,domain=-1:1
] {x*x};
\end{axis}
\end{tikzpicture}
\end{document}
변경되지 않은 버전의 경우 크기 조정 및 색상 지정이 작동하고 변경된 버전의 경우 두 가지 중 어느 것도 작동하지 않습니다.
완성을 위해 원본 pgfplots
코드를 대체합니다. (여기서 메타 값에 대한 내용은 전혀 보이지 않습니다?!?)
\def\pgfplotsplothandlerquiver@vis@path#1{%
\pgfpathmoveto{#1}%
\pgfplotsaxisvisphasetransformcoordinate\pgfplots@quiver@u\pgfplots@quiver@v\pgfplots@quiver@w
\pgfpathlineto{%
\pgfplotsifcurplotthreedim{%
\pgfplotsqpointxyz\pgfplots@quiver@u\pgfplots@quiver@v\pgfplots@quiver@w
}{%
\pgfplotsqpointxy\pgfplots@quiver@u\pgfplots@quiver@v
}%
}%
}%
답변1
다음은 나에게 효과적입니다.
\documentclass[border=9,tikz]{standalone}
\usepackage{pgfplots}\pgfplotsset{compat=newest}
\usetikzlibrary{arrows.meta}
\begin{document}
\makeatletter
\def\pgfplotsplothandlerquiver@vis@path#1{%
% remember (x,y) in a robust way
#1%
\pgfmathsetmacro\pgfplots@quiver@x{\pgf@x}\global\let\pgfplots@quiver@x\pgfplots@quiver@x%
\pgfmathsetmacro\pgfplots@quiver@y{\pgf@y}\global\let\pgfplots@quiver@y\pgfplots@quiver@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[
point meta=x,
quiver={
u=x,v=y,
every arrow/.append style={%
-{Latex[scale length={max(0.1,\pgfplotspointmetatransformed/1000)}]},mapped color
},
after arrow/.code={
\relax{% always protect the shift
\pgftransformshift{\pgfpoint{\pgfplots@quiver@x}{\pgfplots@quiver@y}}%
\node[below right]{\tiny\color{mapped color}\pgfplotspointmetatransformed};
}
}
},
->,samples=10,domain=-1:1
]{x*x-1};
\addplot[
point meta=x,
quiver={
u=x,v=y,
every arrow/.append style={%
-{Latex[scale length={max(0.1,\pgfplotspointmetatransformed/1000)}]},mapped color
},
},
->,samples=10,domain=-1:1
]{x*x};
\end{axis}
\end{tikzpicture}
\end{document}
설명
이 코드와 이전 질문의 주요 차이점은 다음과 같습니다.
\pgfmathsetmacro\pgfplots@quiver@x{\pgf@x}
\pgfmathsetmacro\pgfplots@quiver@y{\pgf@y}
로 만들어집니다
\pgfmathsetmacro\pgfplots@quiver@x{\pgf@x}\global\let\pgfplots@quiver@x\pgfplots@quiver@x%
\pgfmathsetmacro\pgfplots@quiver@y{\pgf@y}\global\let\pgfplots@quiver@y\pgfplots@quiver@y%
이는 추가 그룹화로 인해 오류가 발생했음을 나타냅니다. 그런데 왜 추가 그룹화가 있는 걸까요? 글쎄, 왜냐하면 pgfplots가 만날 때
\draw[/pgfplots/quiver/every arrow]...
의 옵션은 \draw
관례적으로 이것에만 영향을 미칩니다 \draw
. 따라서 티케이\draw
Z는 이것을 그룹에 넣을 것입니다 . 그리고 는 \pgfplotsplothandlerquiver@vis@path
그룹으로 묶어서 \pgfplots@quiver@x
외부(특히 내부 after arrow
)에서는 볼 수 없습니다.
그런데 #1
대략적 \pgfplotsplothandlerquiver@vis@path
으로 말하자면,
\global\pgf@x=\pgf@x
\global\pgf@x=\pgf@y
그리고 위의 분석은 이에 대한 필요성을 보여준다.