我想用 重现下图所示的
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
在不重置边界框的情况下获得相同的结果。