我有下图(我使用 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}
我考虑过这个问题,并找到了三种方法来使情节对齐:
我可以在第二个子图的 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}
我可以按照 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,
我可以通过改变行(代码中的第三行)强制所有数字都有一个小数点(因此所有的 y 标签都有相同的宽度)
\pgfkeys{/pgf/number format/.cd,fixed,precision=3}
到
\pgfkeys{/pgf/number format/.cd,fixed,fixed zerofill,precision=1}
我喜欢解决方案 1 和 2 的结果,它们产生了相同的数字,如下所示
但其实施方式存在缺陷,当子图数量超过 4 个时可能难以应用(而且解决方案 2 甚至可能不起作用!)。
我喜欢第三种解决方案的实现方式:一个使一切正常工作的全局设置,但我真的不喜欢最终的结果(那些.0
真的很丑!):
我的问题是:我该如何最佳地解决这个问题?是否有一个全局设置可以应用,强制所有子图对齐,而无需诉诸隐形文字、假小数点或更改图的定义顺序?
答案1
这与PGFplot 占据整个 \linewidth,并与 tikzpicture 上的 y=轴对齐Jake 提供了一个解决方案,为每个图形命名,并保持它们相同tikzpicture
,并使用锚点定位它们。
不过,我更喜欢的解决方案是设置所需的宽度yticklabel
:
\pgfplotsset{yticklabel style={text width=3em,align=right}}
如果 x 轴刻度标签的大小也不同,您也需要类似的设置来固定它们的宽度。
答案2
我看到了一些目前还未详细阐述的进一步的替代方案:
只需将其放入
\begin{tikzpicture}...\end{tikzpicture}
LaTeX 表格中即可。这很简单;您可以使用 执行相同的操作\includegraphics
。除了 之外\includegraphics
,baseline
tikz 的功能还允许简单而有效的垂直对齐。此外,trim left
和trim right
功能允许简单而有效的水平对齐(请参阅http://mirror.ctan.org/graphics/pgf/contrib/pgfplots/doc/latex/pgfplots/pgfplots.pdf, 对齐部分, 小节“数组形式对齐(子图)””。使用包含轴数组的单个图片,即类似 的模式
\begin{tikzpicture} \matrix{ multiple axes }; \end{tikzpicture}
。这允许相当简单的对齐!可惜,由于 的弱点,它需要对图例条目进行特殊处理\matrix
。如果您使用external
库(推荐),则需要更多时间,因为图片会变大。这种方法与上面显示的方法完全相同——但\matrix
tikz 的 以完全自动化的方式对齐所有轴。有关示例和详细信息,请参阅上面发布的链接。使用 pgfplots 附带的 groupplots 库。如果轴紧密相关(例如,如果它们共享轴描述,如
xlabel
甚至刻度标签),它会专门处理数组形式的轴。但请注意,在自动处理边界框方面,其他方法更好。
就我个人而言,我一直使用方法 (1):我喜欢有单独的、分离的图片,可以轻松复制粘贴到另一个文档中。此外,这简化了图像外部化,因为每个图像都可以写入单独的图像.pdf
(请参阅external
pgfplots 或软件包附带的库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}