在 pgfplots 图中对齐子图

在 pgfplots 图中对齐子图

我有下图(我使用 matlab2tikz 创建的图形的非常精简的版本)

在此处输入图片描述

我的问题是,由于第 2 和第 4 个子图(第二列上的子图)的 y 轴标签宽度不同,导致子图未正确对齐。此 MWE 的代码为

\documentclass{standalone}
\usepackage{pgfplots, tikz}
\pgfkeys{/pgf/number format/.cd,fixed,precision=3}
\pgfplotsset{
    compat=1.3, 
    every axis/.append style={scale only axis, axis on top,
    height=4.25cm, width=4.5cm, xmin=-1, xmax=240,
    }
}

\begin{document}
\begin{tikzpicture}

    \begin{axis}[%
    name=plot1,
    ymin=-0.5, ymax=0]
    \end{axis}

    \begin{axis}[%
    name=plot2,
    at=(plot1.right of south east), anchor=left of south west,
    ymin=-6.5, ymax=0.2]
    \end{axis}

    \begin{axis}[%
    name=plot4,
    at=(plot2.below south west), anchor=above north west,
    ymin=-1.2, ymax=0]
    \end{axis}

    \begin{axis}[%
    name=plot3,
    at=(plot4.left of south west), anchor=right of south east,
    ymin=-1, ymax=0]
    \end{axis}

\end{tikzpicture}
\end{document}

我考虑过这个问题,并找到了三种方法来使情节对齐:

  1. 我可以在第二个子图的 y 轴标签中插入不可见的东西,通过在第二个轴上添加两条线,使其与第四个子图的 y 轴一样宽:

    \begin{axis}[%
    name=plot2,
    at=(plot1.right of south east), anchor=left of south west,
    ymin=-6.5, ymax=0.2,
    ytick={-6,-4,-2,0},
    yticklabels={{\color{white} 0.}$-6$,$-4$,$-2$,$0$} ]
    \end{axis}
    
  2. 我可以按照 1-> 3 -> 4 -> 2 的顺序定义子图及其定位,而不是按照 1 -> 2 -> 4 -> 3 的顺序。这将需要改变定义轴的顺序,以及定义定位的线。完整代码可见这里,但感兴趣的行按其出现的顺序将是

    name=plot1,
    
    name=plot3,
    at=(plot1.below south east), anchor=above north east,
    
    name=plot4,
    at=(plot3.right of north east), anchor=left of north west,
    
    name=plot2,
    at=(plot4.above north west), anchor=below south west,
    
  3. 我可以通过改变行(代码中的第三行)强制所有数字都有一个小数点(因此所有的 y 标签都有相同的宽度)

    \pgfkeys{/pgf/number format/.cd,fixed,precision=3}
    

    \pgfkeys{/pgf/number format/.cd,fixed,fixed zerofill,precision=1}

我喜欢解决方案 1 和 2 的结果,它们产生了相同的数字,如下所示

来自解决方案 1 和 2 的图

但其实施方式存在缺陷,当子图数量超过 4 个时可能难以应用(而且解决方案 2 甚至可能不起作用!)。

我喜欢第三种解决方案的实现方式:一个使一切正常工作的全局设置,但我真的不喜欢最终的结果(那些.0真的很丑!):

图来自解决方案 3

我的问题是:我该如何最佳地解决这个问题?是否有一个全局设置可以应用,强制所有子图对齐,而无需诉诸隐形文字、假小数点或更改图的定义顺序?

答案1

这与PGFplot 占据整个 \linewidth,并与 tikzpicture 上的 y=轴对齐Jake 提供了一个解决方案,为每个图形命名,并保持它们相同tikzpicture,并使用锚点定位它们。

不过,我更喜欢的解决方案是设置所需的宽度yticklabel

\pgfplotsset{yticklabel style={text width=3em,align=right}}

如果 x 轴刻度标签的大小也不同,您也需要类似的设置来固定它们的宽度。

在此处输入图片描述

答案2

我看到了一些目前还未详细阐述的进一步的替代方案:

  1. 只需将其放入\begin{tikzpicture}...\end{tikzpicture}LaTeX 表格中即可。这很简单;您可以使用 执行相同的操作\includegraphics。除了 之外\includegraphicsbaselinetikz 的功能还允许简单而有效的垂直对齐。此外,trim lefttrim right功能允许简单而有效的水平对齐(请参阅http://mirror.ctan.org/graphics/pgf/contrib/pgfplots/doc/latex/pgfplots/pgfplots.pdf, 对齐部分, 小节“数组形式对齐(子图)””。

  2. 使用包含轴数组的单个图片,即类似 的模式 \begin{tikzpicture} \matrix{ multiple axes }; \end{tikzpicture}。这允许相当简单的对齐!可惜,由于 的弱点,它需要对图例条目进行特殊处理\matrix。如果您使用external库(推荐),则需要更多时间,因为图片会变大。这种方法与上面显示的方法完全相同——但\matrixtikz 的 以完全自动化的方式对齐所有轴。有关示例和详细信息,请参阅上面发布的链接。

  3. 使用 pgfplots 附带的 groupplots 库。如果轴紧密相关(例如,如果它们共享轴描述,如xlabel甚至刻度标签),它会专门处理数组形式的轴。但请注意,在自动处理边界框方面​​,其他方法更好。

就我个人而言,我一直使用方法 (1):我喜欢有单独的、分离的图片,可以轻松复制粘贴到另一个文档中。此外,这简化了图像外部化,因为每个图像都可以写入单独的图像.pdf(请参阅externalpgfplots 或软件包附带的库standalone)。

我还发现如果勾选标签在外部页面的,即左列使用默认设置,右列使用yticklabel pos=right。同样,上面的链接显示了示例。这种方法可以轻松地将整个图形置于页面中间,也许可以在页面边缘放置刻度标签,并将轴的框与页面的文本宽度对齐。

答案3

作为一种快速而肮脏的解决方案,添加精确的xshift=2.8mm轴选项的选项plot2似乎解决了这个问题:)但是使用matrix环境可以在不引用锚点的情况下解决问题:

\documentclass[article]
\usepackage{tikz,pgfplots}
\usetikzlibrary{matrix}
\pgfkeys{/pgf/number format/.cd,fixed,precision=3}
\pgfplotsset{
    compat=1.3, 
    every axis/.append style={scale only axis, axis on top,
    height=4.25cm, width=4.5cm, xmin=-1, xmax=240,
    }
}
\begin{document}
\begin{tikzpicture}
\matrix{
\begin{axis}[%
name=plot1,
ymin=-0.5, ymax=0]
\end{axis}

&\begin{axis}[%
name=plot2,
ymin=-6.5, ymax=0.2]
\end{axis} \
\begin{axis}[%
name=plot4,
ymin=-1.2, ymax=0]
\end{axis}

& \begin{axis}[%
name=plot3,
ymin=-1, ymax=0]
\end{axis}\\
};
\end{tikzpicture}
\end{document}

相关内容