pgfplots — 按 x 轴对齐两个单独的图并对齐标题

pgfplots — 按 x 轴对齐两个单独的图并对齐标题

这是一个说明问题的具体例子

在此处输入图片描述

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

相关内容