在 tikz 中定位 pgfplot(了解锚点、旋转和比例)

在 tikz 中定位 pgfplot(了解锚点、旋转和比例)

我正在尝试将抛物线的绘图旋转到上方tikzpicture。(对于抛物线,我可以在不使用的情况下实现我想要的效果pgfplots,但对于更复杂的绘图,我需要相同的效果。)我似乎无法理解旋转锚点的工作原理,也无法理解缩放tikz对它们的影响。我目前得到的是:

有尺度

无尺度

两张图片的区别在于第一张图scale=1.5在 中添加了一个修饰符tikzpicture。蓝色抛物线应该位于黑色抛物线的位置(即中心位于b)。添加绿色抛物线只是为了可视化奇怪的行为。

  1. 关于规模。我见过,但据我所知,我在pgfplot计算中不使用外部元素(仅使用原点位置)。因此,绘图完成后缩放应该没有问题。此外,如第二张图所示,即使scale删除输入,抛物线的位置和大小仍然不正确。为什么 不能scale与 正常工作pgfplot?缩放怎么可能将点(0,0)向上或向下移动(“奇怪的行为”)?(也许第二个问题与锚定不良有关?)此外,如果绘图域与黑色抛物线使用的相同,为什么蓝色抛物线如此之大,即使没有缩放?

  2. 关于轮换。我采取了这里并且它似乎工作正常,尽管使用了错误的锚点。但是,我不完全理解它的语句。我知道rotate around={90:(current axis.origin)}围绕第二个条目旋转(current axis.origin)。但是当前轴是什么?除了这个,我还能写什么其他选项?我找不到有关旋转整个图的任何信息pgfplots 手动的

  3. 关于锚定。它不起作用,我不明白为什么不起作用。如果没有这个at选项,错位会更严重(我实际上需要这个选项,因为我想手动设置情节位置,就像完成的那样这里)。我的理解是:选项在坐标中at固定一个点;然后,选项获取坐标的位置并将其固定在 上,直接位于 上。这样对吗?如果是这样,为什么我的代码不起作用?该点位于和的中间,因此将绘图原点放置在 处,然后围绕其原点旋转绘图就足以将蓝色抛物线放置在黑色抛物线上方(将绿色抛物线放置在 上)。AtikzpictureanchorBpgfplottikzpictureA(0,0)ab(0,0)a

当然,欢迎提供运行代码,但我主要想了解这种布局的工作原理,以便我也可以将其用于其他复杂的情节。提前谢谢您!

梅威瑟:

\documentclass{standalone}
\usepackage{tikz,pgfplots}
%\pgfplotsset{compat=1.15} %this line removes the warning but cuts the picture

\begin{document}
\begin{tikzpicture}
    [scale=1.5] %remove this line for figure 2
    
    \coordinate (a) at (-1,0);
    \coordinate (b) at (1,0);
    \coordinate (o) at (0,0);
    
    %draw reference line
    \filldraw (a) node[below]{$a$} (a) {} circle (0.3pt);
    \filldraw (b) node[below]{$b$} (b) {} circle (0.3pt);
    \draw[-] (-1.5,0)--(1.5,0);
    
    %these are out of scale and misplaced
    \begin{axis}[at={(o)}, %where the origin is supposed to be
        anchor=origin, % i have tried center as well
        rotate around={-90:(current axis.origin)}, % Supposed to rotate around the origin
        domain=-1:1,
        hide axis]
        \addplot[blue] {x^2+1};
    \end{axis}

    \begin{axis}[at={(o)}, %where the origin is supposed to be
            anchor=origin, % i have tried center as well
            rotate around={90:(current axis.origin)}, % Supposed to rotate around the origin
            domain=-1:1,
            hide axis]
            \addplot[green] {x^2+1};
    \end{axis}
    
    %what it should be
    \draw[black, rotate=-90]   plot[smooth,domain=-1:1] (\x, {(\x)^2+1});
\end{tikzpicture}
\end{document}

答案1

要缩放图表,请调整宽度(高度)。

\documentclass{standalone}
\usepackage{tikz,pgfplots}
\usetikzlibrary{calc}
%\pgfplotsset{compat=1.15} %this line removes the warning but cuts the picture

\begin{document}
\begin{tikzpicture}
    %[scale=1.5] %remove this line for figure 2
    
    \begin{axis}[scale only axis, axis equal image, width=4cm,
        rotate=90,
        domain=-1:1,
        hide axis]
        \addplot[blue] {x*x+1};
        \addplot[green] {-1-x*x};
        \coordinate (a) at (axis cs: 0,1);
        \coordinate (b) at (axis cs: 0,-1);
    \end{axis}
   
    %draw reference line
    \filldraw (a) node[below]{$a$} {} circle (0.3pt);
    \filldraw (b) node[below]{$b$} {} circle (0.3pt);
    \draw[-] ($(a)!1.5!(b)$)--($(b)!1.5!(a)$);
 
\end{tikzpicture}
\end{document}

演示


这会尝试移动 pgfplots。不太确定小偏移量来自哪里。

\documentclass{standalone}
\usepackage{tikz,pgfplots}
\usetikzlibrary{calc}
%\pgfplotsset{compat=1.15} %this line removes the warning but cuts the picture

\newsavebox{\tempboxA}
\newsavebox{\tempboxB}

\begin{document}
\savebox{\tempboxA}{\begin{tikzpicture}
  \begin{axis}[scale only axis, axis equal image, height=2cm,
        rotate=-90,
        domain=-1:1,
        hide axis]
        \addplot[blue] {x*x+1};
        \coordinate (A) at (axis cs:0,0);
  \end{axis}
  \begin{pgfinterruptboundingbox}
    \path (A);
    \pgfgetlastxy{\xA}{\yA}
    \global\let\xA=\xA
    \global\let\yA=\yA
  \end{pgfinterruptboundingbox}
\end{tikzpicture}}%
%
\savebox{\tempboxB}{\begin{tikzpicture}
  \begin{axis}[scale only axis, axis equal image, height=2cm,
        rotate=90,
        domain=-1:1,
        hide axis]
        \addplot[green] {x*x+1};
        \coordinate (B) at (axis cs:0,0);
  \end{axis}
  \begin{pgfinterruptboundingbox}
    \path (B);
    \pgfgetlastxy{\xB}{\yB}
    \global\let\xB=\xB
    \global\let\yB=\yB
  \end{pgfinterruptboundingbox}
\end{tikzpicture}}%
%
\begin{tikzpicture}
    %[scale=1.5] %remove this line for figure 2
    
    \coordinate (a) at (-1,0);
    \coordinate (b) at (1,0);
    \coordinate (o) at (0,0);
    
    %draw reference line
    \filldraw (a) node[below]{$a$} {} circle (0.3pt);
    \filldraw (b) node[below]{$b$} {} circle (0.3pt);
    \draw[-] (-1.5,0)--(1.5,0);
    
    \node[above right, xshift={-\xA}, yshift={-\yA}, inner sep=0pt] at (o) {\usebox\tempboxA};
    \node[above right, xshift={-\xB}, yshift={-\yB}, inner sep=0pt] at (o) {\usebox\tempboxB};
    
    %what it should be
    \draw[black, rotate=-90]   plot[smooth,domain=-1:1] (\x, {(\x)^2+1});
\end{tikzpicture}
\end{document}

相关内容