訪問 (u,v) 相對座標的脆弱方法

訪問 (u,v) 相對座標的脆弱方法

自從這個問題可能內容過多,包含了太多不必要的細節,我嘗試將其重新表述為更簡潔、更全面的形式。

問題是我想在自己的一段代碼中訪問箭袋圖坐標(x,y,u,v),在quiver/after arrow/.code, 或 中quiver/before arrow/.code。以下範例完全沒有意義,因為人們可以輕鬆地更改 u 和 v 值。但是,這個問題與我的另一個問題完全相同。

在程式碼中,我新增了一條註釋,在其中嘗試存取座標並註解掉不同的非工作可能性。

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

答案1

目前的設計quiver非常不靈活。繪製箭頭時,(x,y) 座標儲存在和 中\pgf@x\pgf@y並且 (u,v) 座標轉換為絕對座標。你沒有太多選擇。

也許您可以使用不同的 兩次繪製相同的函數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}

訪問 (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...以下程式碼修改內部過程,使 `\pgfplots@quiver@x` 為畫布 x 座標,`\pgfplots@quiver@u` 為畫布相對 u 座標。 \documentclass[border=9,tikz]{standalone} \usepackage{pgfplots}\porder=9,tikz]{standalone} \usepackage{pgfplots}\porder=9,tikz]{standalone} \usepackage{pgfplots}\pgfplotsset{compat=newest} \begin{document} \makeatletter \def\pgfplotsplothandlerquiver@vis@path#1{% % letter \def\pgfplotsplothandlerquiver@vis@path#1{% % %(x,y )以穩健的方式#1% \pgfmathsetmacro\pgfplots@quiver@x{\pgf@x}% \pgfmathsetmacro\pgfplots@quiver@y{\pgf@y}% % 在相對座標\pgfplotsaxisvisphasetransformcooperative\pgf@y}% % 在相對座標\pgfplotsaxisvisphasetransformcooperative\ 中計算(u, v) pgfplots@quiver@u\pgfplots@quiver@v\pgfplots@quiver@w% \pgfmathsetmacro\pgfplots@quiver@u{\psetplots@quiver@u-\pgfplots@quiver@xgf}% \pgfmathsetgfplro\quiver@u-\pgfplots@quiver@xgf}% \pgfmathsetgfplro\pgfplots @v {\pgfplots@quiver@v-\pgfplots@quiver@y}% % 移動到(x,y) 並開始繪圖{% \pgftransformshift{\pgfpoint{\pgfplots@quiver@x}{\pgfplots@quiver@ y} }% \pgfpathmoveto{\pgfpointorigin}% \pgfpathlineto{\pgfplotsqpointxy\pgfplots@quiver@u\pgfplots@quiver@v}% }% }% \begin{tikzpicture} \begin{axis}[軸相等] \addplot [ quiver ={u=x,v=y, arrow/.code={ \relax{% 始終保護移位\pgftransformshift{\pgfpoint{\pgfplots@quiver@x}{\pgfplots@quiver@y}}% \ node [右下]{$(u,v)=(\pgfplots@quiver@u,\pgfplots@quiver@v)$}; } } }, ->, 樣本=10,域=0:1 ] {x*x}; \end{軸} \end{tikzpicture} \end{文檔} [![][2]][2]

免責聲明

目前before arrowafter arrow沒有在包包的其他地方使用。 (u,v) 處於絕對座標的事實將來可能會改變。

相關內容