设置 pgfplots 图相对于轴的边界框

设置 pgfplots 图相对于轴的边界框

tl;dr:如何裁剪standalone与绘图轴具有固定距离的 pgfplot 图?

背景:

我有四张pgfplot图,如下所示PDF 图像按类别standalone。由于 ztick 标签不同,框的垂直边缘(例如z-axis)目前对齐不佳(尽管并非如此方式关闭)当我把它们放在子图中时:

enter image description here

由于我的实际数据很大,所以不是把这四个放在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

相关内容