説明

説明

だから、@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。したがって、Ti\drawZ はこれをグループに入れます。\pgfplotsplothandlerquiver@vis@pathはグループに入れられるので、\pgfplots@quiver@x外部からは見ることができません (特に ではafter arrow)。


ちなみに、#1の は\pgfplotsplothandlerquiver@vis@path、大まかに言えば、

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

そして、上記の分析は、この必要性を示しています。

関連情報