Erläuterung

Erläuterung

Nach dembrillante Lösung von @Symbol1zu meiner letzten Frage, ich habe eine neue zum gleichen Thema. Mit dem vorgeschlagenen Code, der das Verhalten von ändert \pgfplotsplothandlerquiver@vis@path, point metascheint es nicht mehr zu funktionieren...

Dies hat Auswirkungen auf die mapped colorund\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}

Bei der unveränderten Version funktioniert die Skalierung und Farbgebung, bei der geänderten Version funktioniert keines von beidem.

Bildbeschreibung hier eingeben

Der Vollständigkeit halber der Originalcode, pgfplotsder ersetzt wird (ich kann hier nichts zu Metawerten sehen?!?)

\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
        }%
    }%
}%

Antwort1

Folgendes funktioniert bei mir.

\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}

Erläuterung

Der Hauptunterschied zwischen diesem Code und dem in Ihrer vorherigen Frage besteht darin, dass

\pgfmathsetmacro\pgfplots@quiver@x{\pgf@x}
\pgfmathsetmacro\pgfplots@quiver@y{\pgf@y}

wird gemacht in

\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%

was darauf schließen lässt, dass der Fehler durch zusätzliche Gruppierung verursacht wird. Aber warum gibt es zusätzliche Gruppierung? Nun, weil pgfplots auf

\draw[/pgfplots/quiver/every arrow]...

die Optionen des \drawsind, per Konvention, nur diese beeinflussend \draw. Daher TikZ wird dies \drawin eine Gruppe packen. Und da \pgfplotsplothandlerquiver@vis@pathdadurch in eine Gruppe gepackt wird, kann man es \pgfplots@quiver@xvon außen (insbesondere in after arrow) nicht sehen.


Übrigens ist die #1der \pgfplotsplothandlerquiver@vis@path, grob gesagt,

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

Und die obige Analyse zeigt, dass dies notwendig ist.

verwandte Informationen