Una forma frágil de acceder a las coordenadas relativas de (u,v)

Una forma frágil de acceder a las coordenadas relativas de (u,v)

Desdeesta preguntaTal vez esté sobrecargado y contenga demasiados detalles innecesarios, traté de reformularlo en una forma más condensada y completa.

El problema es que quiero acceder a las coordenadas del gráfico del carcaj (x,y,u,v) en un código propio, en quiver/after arrow/.codeo alternativamente en quiver/before arrow/.code. El siguiente ejemplo no tiene mucho sentido, ya que fácilmente se podrían cambiar los valores u y v. Sin embargo, el problema es exactamente el mismo que en mi otra pregunta.

En el código he añadido un comentario donde intento acceder a las coordenadas y donde se comentan diferentes posibilidades que no funcionan.

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

Respuesta1

Actualmente el diseño de quiveres muy inflexible. En el momento en que se dibujan las flechas, las coordenadas (x,y) se almacenan en \pgf@xy \pgf@ylas coordenadas (u,v) se traducen a coordenadas absolutas. No tienes muchas opciones.

Quizás puedas trazar la misma función dos veces con diferentes 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}

Una forma frágil de acceder a las coordenadas relativas de (u,v)

\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... El siguiente código modifica el procedimiento interno para que `\pgfplots@quiver@x` sea la coordenada x del lienzo y `\pgfplots@quiver@u` sea la coordenada u relativa del lienzo. \documentclass[border=9,tikz]{independiente} \usepackage{pgfplots}\pgfplotsset{compat=newest} \begin{document} \makeatletter \def\pgfplotsplothandlerquiver@vis@path#1{% % recuerda (x,y) de forma robusta #1% \pgfmathsetmacro\pgfplots@quiver@x{\pgf@x}% \pgfmathsetmacro\pgfplots@quiver@y{\pgf@y}% % calcular (u,v) en coordenadas relativas \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}% % muévete a (x,y) y comienza a dibujar {% \pgftransformshift{\pgfpoint{\pgfplots@quiver@x}{\pgfplots@quiver@y} }% \pgfpathmoveto{\pgfpointorigin}% \pgfpathlineto{\pgfplotsqpointxy\pgfplots@quiver@u\pgfplots@quiver@v}% }% }% \begin{tikzpicture} \begin{axis}[eje igual] \addplot[ quiver ={u=x,v=y, después de flecha/.code={ \relax{% siempre protege el turno \pgftransformshift{\pgfpoint{\pgfplots@quiver@x}{\pgfplots@quiver@y}}% \node [abajo a la derecha]{$(u,v)=(\pgfplots@quiver@u,\pgfplots@quiver@v)$}; } } }, ->, muestras=10,dominio=0:1 ] {x*x}; \end{axis} \end{tikzpicture} \end{document} [![][2]][2]

Descargo de responsabilidad

Actualmente before arrowy after arrowno se utiliza en ninguna otra parte del paquete. El hecho de que (u,v) esté en coordenadas absolutas podría cambiarse en el futuro.

información relacionada