tl;dr:如何裁剪standalone
与绘图轴具有固定距离的 pgfplot 图?
背景:
我有四张pgfplot
图,如下所示PDF 图像按类别standalone
。由于 ztick 标签不同,框的垂直边缘(例如z-axis
)目前对齐不佳(尽管并非如此方式关闭)当我把它们放在子图中时:
由于我的实际数据很大,所以不是把这四个放在tikzpictures
我的主要文档中是可行的。有两个详细的答案:一种基于external
库的使用,另一种使用一些花哨的修剪。
但是,我想保持它简单(我的主要文档的代码以及没有手动复制粘贴的修剪参数)。
我可以只standalone
裁剪与绘图轴具有固定距离的绘图吗?
在 2D 中这应该不是不可能的。在 3D 中,需要从图周围的框的顶部/底部顶点定义距离。
这是我的主文件的 MWE:
% !TeX program = lualatex
\documentclass{scrbook}
\usepackage[partial=upright]{unicode-math}
\usepackage{fontspec}
\usepackage{caption,subcaption}
\usepackage{graphicx}
\usepackage[main=ngerman,english]{babel}
\begin{document}
\begin{figure}
%
\begin{subfigure}{0.5\linewidth}
\includegraphics{3dplot_a.pdf}
\end{subfigure}
%
\begin{subfigure}{0.5\linewidth}
\includegraphics{3dplot_b.pdf}
\end{subfigure}
%
\begin{subfigure}{0.5\linewidth}
\includegraphics{3dplot_c.pdf}
\end{subfigure}
%
\begin{subfigure}{0.5\linewidth}
\includegraphics{3dplot_d.pdf}
\end{subfigure}
%
\end{figure}
\end{document}
以下是生成四个示例图的代码(为方便起见,所有文件都可以在此找到GitHub 仓库):
% !TeX program = lualatex
\RequirePackage{luatex85}
\documentclass[border=1pt]{standalone}
\usepackage{mathtools}
\usepackage{amssymb}
\usepackage[partial=upright]{unicode-math}
\usepackage{fontspec}
\usepackage{xcolor}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage[main=ngerman,english]{babel}
\begin{document}
% plot a
\begin{tikzpicture}
\begin{axis}[
width=7cm,
grid=both,
view={60}{45},
set layers,
every axis plot/.append style={on layer=pre main},
xlabel={$x$},
ylabel={$y$},
zlabel={some quantity $z$},
grid=both,
clip=false,
]
\addplot3 [
mesh,
scatter,
samples=10,
domain=0:1,
] {5*x*sin(2*deg(x)) * y*(1-y)};
\node at (rel axis cs:0.5,1,1) [above,sloped like x axis] {$x$ explanation};
\node at (rel axis cs:0,0.5,1) [above,sloped like y axis] {$y$ explanation};
\end{axis}
\end{tikzpicture}
%% plot b
%\begin{tikzpicture}
% \begin{axis}[
% width=7cm,
% grid=both,
% view={60}{45},
% set layers,
% every axis plot/.append style={on layer=pre main},
% xlabel={$x$},
% ylabel={$y$},
% zlabel={another quantity $z$},
% grid=both,
% clip=false,
% ]
% \addplot3 [
% mesh,
% scatter,
% samples=10,
% domain=0:1,
% ] {5*x*cos (2*deg(x)) * y*(1-y) + 15};
% \node at (rel axis cs:0.5,1,1) [above,sloped like x axis] {$x$ explanation};
% \node at (rel axis cs:0,0.5,1) [above,sloped like y axis] {$y$ explanation};
% \end{axis}
%\end{tikzpicture}
%% plot c
%\begin{tikzpicture}[trim axis left, trim axis right]
% \begin{axis}[
% width=7cm,
% grid=both,
% view={60}{45},
% set layers,
% every axis plot/.append style={on layer=pre main},
% xlabel={$x$},
% ylabel={$y$},
% ztick={0},
% zlabel={third quantity $z$},
% grid=both,
% clip=false,
% ]
% \addplot3 [
% mesh,
% scatter,
% samples=10,
% domain=0:1,
% ] {5*sin (4*deg(x)) * y*(1-y)};
% \node at (rel axis cs:0.5,1,1) [above,sloped like x axis] {$x$ explanation};
% \node at (rel axis cs:0,0.5,1) [above,sloped like y axis] {$y$ explanation};
% \end{axis}
%\end{tikzpicture}
%% plot d
%\begin{tikzpicture}[trim axis left, trim axis right]
% \begin{axis}[
% width=7cm,
% grid=both,
% view={60}{45},
% set layers,
% every axis plot/.append style={on layer=pre main},
% xlabel={$x$},
% ylabel={$y$},
% ztick={1000},
% zlabel={fourth quantity $z$},
% grid=both,
% clip=false,
% ]
% \addplot3 [
% mesh,
% scatter,
% samples=10,
% domain=0:1,
% ] {x*y+1000};
% \node at (rel axis cs:0.5,1,1) [above,sloped like x axis] {$x$ explanation};
% \node at (rel axis cs:0,0.5,1) [above,sloped like y axis] {$y$ explanation};
% \end{axis}
%\end{tikzpicture}
\end{document}
答案1
pgfplots
提供键trim axis left
和,trim axis right
这将设置边界框,tikzpicture
使其左边缘沿着框的左侧axis
(即刻度标签等在边界框之外),右侧也是如此。请注意,这些必须提供给环境tikzpicture
,而不是axis
环境,即
\begin{tikzpicture}[trim axis left,trim axis right]
因此,这些将处理边界框的水平扩展。对于垂直扩展,您也许可以将键添加overlay
到包含轴标签的节点,使用label style={overlay}
。此选项意味着在计算边界框时不会考虑节点/路径。同样,您可能希望将overlay
其添加到“解释”节点。
最后需要注意的是,standalone
您可以单独设置每一侧的边框。例如,您可以这样做
\documentclass[border={1.5cm 2pt 5mm 2pt}]{standalone}
左侧边框为 1.5cm,右侧边框为 5mm,底部和顶部边框为 2pt。(手册上说这些值的顺序分别指左侧、右侧、底部和顶部,但从我的测试来看,它实际上是左侧、底部、右侧、顶部,就像 一样trim
。\includegraphics
)