这是一个说明问题的具体例子
\documentclass{article}
\usepackage{pgfplots}
\usepackage{float}
\begin{document}
\begin{figure}[H]
\pgfplotsset{disabledatascaling}
\begin{minipage}{0.5\linewidth}
\rule{1pt}{157pt} % dirty hack
\centering
\begin{tikzpicture}
\begin{axis}[
axis lines = center,
xmin=-2,
xmax=1,
ymin=-1,
ymax=2,
unit vector ratio=1 1,
]
\pgfplotsextra{\xdef\pUnit{\pgfplotsunitylength}}
\addplot[blue,samples=100] (x, x^2);
\end{axis}
\end{tikzpicture}
\rule{1pt}{50pt} % dirty hack
\caption{}
\end{minipage}
\quad
\begin{minipage}{0.5\linewidth}
\centering
\begin{tikzpicture}
\begin{axis}[x=\pUnit,y=\pUnit,
axis lines = center,
xmin=-1.5,
xmax=1,
ymin=-2,
ymax=5,
xtick distance=1,
ytick distance=1
]
\addplot[blue,samples=100] (x/2, x^3);
\end{axis}
\end{tikzpicture}
\caption{}
\end{minipage}
\end{figure}
\end{document}
如您所见,目前我设法通过滥用获得了所需的对齐\rule
,但它需要反复试验,因此需要数十次编译迭代才能目测对齐。
故意保持规则的宽度以使其可见
如何使这个过程自动化,并获得两者的精确对齐:两个 tikzpictures 按 x 轴对齐,而且还有标题,以便它们出现在相同的高度?
答案1
这将使用 对齐 tikzpictures [baseline=(...)]
,并使用单独的行对齐标题。我使用 是\makebox
因为 tikzpictures 不适合给定的空间。
\documentclass{article}
\usepackage{pgfplots}
%\usepackage{float}
\usepackage{showframe}
\begin{document}
\begin{figure}[ht]% friends don't let friends use H
\pgfplotsset{disabledatascaling}
\makebox[0.5\linewidth]{%
\begin{tikzpicture}[baseline=(origin)]
\begin{axis}[unit vector ratio=1 1,
axis lines = center,
%domain=(-2:1),
xmin=-2,
xmax=1,
ymin=-1,
ymax=2,
]
\addplot[blue,samples=100] (x, x^2);
\pgfplotsextra{\xdef\pUnit{\pgfplotsunitylength}}
\coordinate (origin) at (axis cs: 0,0);% Note additions
\end{axis}
\end{tikzpicture}}%
\makebox[0.5\linewidth]{%
\begin{tikzpicture}[baseline=(origin)]
\begin{axis}[x={\pUnit}, y={\pUnit},
axis lines = center,
%domain=(-3:2),
xmin=-1.5,
xmax=1,
ymin=-2,
ymax=5,
xtick distance=1,
ytick distance=1
]
\addplot[blue,samples=100] (x/2, x^3);
\coordinate (origin) at (axis cs: 0,0);% Note additions
\end{axis}
\end{tikzpicture}}
\begin{minipage}[t]{0.5\linewidth}
\caption{}
\end{minipage}%
\begin{minipage}[t]{0.5\linewidth}
\caption{}
\end{minipage}
\end{figure}
\end{document}
答案2
本答案仅总结约翰·科米洛的答案经过了一些改进,使其变得更加简单。但所有的功劳都归功于他的回答。
这里的关键是在原点为每个 tikzpictures 设置一个基线(0,0)
。这可以通过预置节点完成:(current axis.origin)
。现在您甚至可以放弃 tikzpictures 的外部包装器,但仍然minipage
仅用于创建标题。
这样我们最终会得到一个非常简单的结构
\begin{figure}
\begin{tikzpicture}[baseline=(current axis.origin)]
...
\end{tikzpicture}
\quad
\begin{tikzpicture}[baseline=(current axis.origin)]
...
\end{tikzpicture}
\begin{minipage}{0.5\linewidth}\caption{}\end{minipage}
\quad
\begin{minipage}{0.5\linewidth}\caption{}\end{minipage}
\end{figure}
\documentclass{article}
\usepackage{pgfplots}
\usepackage{float} % only for H firgure placement
\begin{document}
\begin{figure}[H]
\pgfplotsset{disabledatascaling}
\begin{tikzpicture}[baseline=(current axis.origin)]
\begin{axis}[
axis lines = center,
xmin=-2,
xmax=1,
ymin=-1,
ymax=2,
unit vector ratio=1 1,
]
\pgfplotsextra{\xdef\pUnit{\pgfplotsunitylength}}
\addplot[blue,samples=100] (x, x^2);
\end{axis}
\end{tikzpicture}
\quad
\begin{tikzpicture}[baseline=(current axis.origin)]
\begin{axis}[x=\pUnit,y=\pUnit,
axis lines = center,
xmin=-1.5,
xmax=1,
ymin=-2,
ymax=5,
xtick distance=1,
ytick distance=1
]
\addplot[blue,samples=100] (x/2, x^3);
\end{axis}
\end{tikzpicture}
\begin{minipage}{0.5\linewidth}\caption{}\end{minipage}
\quad
\begin{minipage}{0.5\linewidth}\caption{}\end{minipage}
\end{figure}
\end{document}