在 beamer 框架中对齐 pgfplots

在 beamer 框架中对齐 pgfplots

我想用 重现下图所示的 Beamer设计Pgfplots

在此处输入图片描述

也就是说,无论轴标签和刻度是什么以及其下方的文本是什么,我希望绘图区域的大小始终相同并且具有相同的位置。

这是我目前的尝试:

\documentclass{beamer}

\usepackage{pgfplots}
\usepackage{pgfplotstable}
\pgfplotsset{table/row sep=\\}
\begin{document}

\newlength{\imglarg}
\newlength{\imghaut}
\setlength{\imglarg}{0.9\textwidth}
\setlength{\imghaut}{0.6\textheight}

% ====
\begin{frame}{Frame 1}
  \begin{figure}
    \begin{tikzpicture}[trim axis left, trim axis right]
      \pgfplotstableread{
        1 4.3\\
        2 4.2\\
        3 3.1\\
        4 2.5\\
      }\tablea
      \begin{axis}[%
        /pgfplots/table/header=false,
        width=\imglarg,
        height=\imghaut,
        axis on top]
        \addplot table[x index=0, y index=1]{\tablea};
      \end{axis}
    \end{tikzpicture}
  \end{figure}
  \vskip0pt plus 1filll%
  \begin{itemize}
  \item You must defeat Sheng Long to stand a chance
  \end{itemize}
\end{frame}

% ====
\begin{frame}{Frame 2}
  \begin{figure}
    \begin{tikzpicture}[trim axis left, trim axis right]
      \pgfplotstableread{%
        1000000 3500000000\\
        2000000 3800000000\\
        3000000 4000000000\\
        4000000 3000000000\\
      }\tableb
      \begin{axis}[%
        /pgfplots/table/header=false,
        width=\imglarg,
        height=\imghaut,
        axis on top]
        \addplot table[x index=0, y index=1]{\tableb};
      \end{axis}
    \end{tikzpicture}
  \end{figure}
  \vskip0pt plus 1filll%
  \begin{itemize}
  \item Xyzzy !
  \item Nothing happens.
  \end{itemize}
\end{frame}

\end{document}

只有在没有不同的情况下才有效随机刻度占用一些空间(例如,如果两个图都是使用 \tableb 绘制的)。经过大量反复试验后,我终于到达这里,因此我远不能确定那里的每一段代码是否有用。

答案1

您遇到的问题是由于边界框造成的。

边界框非常大,可以容纳每个框内的所有内容tikzpicture

解决方法是为每张图片设置相同的边界框。这将使它们位于演示文稿中的相同位置(只要代码一致)。

好的,所以可以通过重置 tikzpicture 的边界框来解决这个问题定影它在每个框架中。

可以按照如下方式完成:

\pgfresetboundingbox % clear the bounding box
\path (current axis.south west) rectangle (current axis.north east);

但是,这将沿轴线对齐。并且任何轴描述都在边界框之外。如果您的幻灯片非常紧凑,则需要将它们包含在边界框中。要在两个没有相同描述的图中执行此操作,您必须明确设置放大。
这可能并不总是首选方法。解决方案是使用 calc 库并移动位置:

\pgfresetboundingbox
\path ($(current axis.south west)-(.5cm,.5cm)$) rectangle 
    ($(current axis.north east)+(.5cm,.5cm)$);

上述操作将采用轴线并使边界框在 4 个方向上分别增大 0.5 厘米。

完整的例子是:

\documentclass{article}
\usepackage{pgfplots}
\usetikzlibrary{calc}
\pgfplotsset{small,height=5.25cm}
\begin{document}
\pagestyle{empty}
\setlength{\fboxsep}{0pt}%

\def\MyAlign{%
    \pgfresetboundingbox
    \path (current axis.south west) rectangle (current axis.north east);
}
\def\MyAlignCm#1{%
    \pgfresetboundingbox
    \path ($(current axis.south west)-(#1cm,#1cm)$) rectangle 
    ($(current axis.north east)+(#1cm,#1cm)$);
}

Following two frames are aligned:

\fbox{%
\begin{minipage}{.6\linewidth}
  \begin{tikzpicture}%
    \begin{axis}[
      xticklabel=\relax,
      yticklabel=\relax,
      domain=-2:2
      ]
      \addplot {x^2};
      \addplot {x^3};
      \addplot {x^4};
    \end{axis}
    \MyAlign
  \end{tikzpicture}%
\end{minipage}
}%

\vspace{.5cm}

\fbox{%
\begin{minipage}{.6\linewidth}
  \begin{tikzpicture}%
    \begin{axis}[
      title=A title,
      xlabel={$x$},
      ylabel={$y$},
      legend style={at={(0.5,0.97)},
          anchor=north,legend columns=-1},
      domain=-2:2
      ]
      \addplot {x^2};
      \addplot {x^3};
      \addplot {x^4};
      \legend{$x^2$,$x^3$,$x^4$}
    \end{axis}
    \MyAlign
  \end{tikzpicture}%
\end{minipage}
}%

\vspace{.5cm}
Following two frames are aligned:

\fbox{%
\begin{minipage}{.6\linewidth}
  \begin{tikzpicture}%
    \begin{axis}[
      xticklabel=\relax,
      yticklabel=\relax,
      domain=-2:2
      ]
      \addplot {x^2};
      \addplot {x^3};
      \addplot {x^4};
    \end{axis}
    \MyAlignCm{.5}
  \end{tikzpicture}%
\end{minipage}
}%

\vspace{.5cm}

\fbox{%
\begin{minipage}{.6\linewidth}
  \begin{tikzpicture}%
    \begin{axis}[
      title=A title,
      xlabel={$x$},
      ylabel={$y$},
      legend style={at={(0.5,0.97)},
          anchor=north,legend columns=-1},
      domain=-2:2
      ]
      \addplot {x^2};
      \addplot {x^3};
      \addplot {x^4};
      \legend{$x^2$,$x^3$,$x^4$}
    \end{axis}
    \MyAlignCm{.5}
  \end{tikzpicture}%
\end{minipage}
}%

\end{document}

这将产生以下输出:

注意对齐

我将把它作为一项练习,以便\phantom在不重置边界框的情况下获得相同的结果。

相关内容