설명

설명

그래서, 그 이후에는@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. 따라서 티케이\drawZ는 이것을 그룹에 넣을 것입니다 . 그리고 는 \pgfplotsplothandlerquiver@vis@path그룹으로 묶어서 \pgfplots@quiver@x외부(특히 내부 after arrow)에서는 볼 수 없습니다.


그런데 #1대략적 \pgfplotsplothandlerquiver@vis@path으로 말하자면,

\global\pgf@x=\pgf@x
\global\pgf@x=\pgf@y

그리고 위의 분석은 이에 대한 필요성을 보여준다.

관련 정보