Eine fragile Möglichkeit, auf die relativen Koordinaten von (u,v) zuzugreifen

Eine fragile Möglichkeit, auf die relativen Koordinaten von (u,v) zuzugreifen

Seitdiese Frageist vielleicht überladen und enthält zu viele unnötige Details, ich habe versucht, es in eine komprimiertere und umfassendere Form umzuformulieren.

Das Problem ist, dass ich in einem eigenen Codestück, in quiver/after arrow/.code, oder alternativ in auf die Koordinaten (x,y,u,v) des Quiver-Plots zugreifen möchte quiver/before arrow/.code. Das folgende Beispiel ergibt nicht ganz Sinn, da man einfach die u- und v-Werte ändern könnte. Das Problem ist jedoch genau das gleiche wie in meiner anderen Frage.

Im Code habe ich einen Kommentar hinzugefügt, wo ich versuche, auf die Koordinaten zuzugreifen und wo verschiedene nicht funktionierende Möglichkeiten auskommentiert sind.

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

Antwort1

Derzeit ist das Design von quiversehr unflexibel. Beim Zeichnen der Pfeile werden die (x,y)-Koordinaten in und gespeichert \pgf@xund \pgf@ydie (u,v)-Koordinaten in absolute Koordinaten übersetzt. Sie haben keine große Auswahl.

Vielleicht können Sie die gleiche Funktion zweimal mit unterschiedlichen darstellen 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}

Eine fragile Möglichkeit, auf die relativen Koordinaten von (u,v) zuzugreifen

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

# OK... Der folgende Code ändert die interne Prozedur so, dass „\pgfplots@quiver@x“ die X-Koordinate der Leinwand und „\pgfplots@quiver@u“ die relative U-Koordinate der Leinwand ist. \documentclass[border=9,tikz]{standalone} \usepackage{pgfplots}\pgfplotsset{compat=newest} \begin{document} \makeatletter \def\pgfplotsplothandlerquiver@vis@path#1{% % (x,y) auf robuste Weise merken #1% \pgfmathsetmacro\pgfplots@quiver@x{\pgf@x}% \pgfmathsetmacro\pgfplots@quiver@y{\pgf@y}% % (u,v) in relativen Koordinaten berechnen \pgfplotsaxisvisphasetransformcoordinate\pgfplots@quiver@u\pgfplots@quiver@v\pgfplots@quiver@w% \pgfmathsetmacro\pgfplots@quiver@u{\pgfplots@quiver@u-\pgfplots@quiver@x}% \pgfmathsetmacro\pgfplots@quiver@v{\pgfplots@quiver@v-\pgfplots@quiver@y}% % gehe zu (x,y) und beginne mit dem Zeichnen {% \pgftransformshift{\pgfpoint{\pgfplots@quiver@x}{\pgfplots@quiver@y}}% \pgfpathmoveto{\pgfpointorigin}% \pgfpathlineto{\pgfplotsqpointxy\pgfplots@quiver@u\pgfplots@quiver@v}% }% }% \begin{tikzpicture} \begin{axis}[Achse gleich] \addplot[ Köcher={u=x,v=y, nach Pfeil/.code={ \relax{% immer die Verschiebung schützen \pgftransformshift{\pgfpoint{\pgfplots@quiver@x}{\pgfplots@quiver@y}}% \node[unten rechts]{$(u,v)=(\pgfplots@quiver@u,\pgfplots@quiver@v)$}; } } }, ->, Proben=10,Domäne=0:1 ] {x*x}; \end{axis} \end{tikzpicture} \end{document} [![][2]][2]

Haftungsausschluss

Derzeit before arrowwird after arrowes an keiner anderen Stelle im Paket verwendet. Die Tatsache, dass (u,v) absolute Koordinaten hat, könnte sich in Zukunft ändern.

verwandte Informationen