pgfplots:轴与轴标签之间的间隙以及顶部的额外刻度:如何删除?

pgfplots:轴与轴标签之间的间隙以及顶部的额外刻度:如何删除?

期望的结果

我正在尝试创建一个绘图,其中下部 x 轴上有xticks和,上部 x 轴上有 。期望的结果 (几乎) 是这样的:xtick labelsextra x tick

期望的结果

平均能量损失

\documentclass[margin=2mm,tikz]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.14}
\begin{document}
\begin{tikzpicture}
    \begin{axis}[
            extra x ticks={-0.0012},
            extra x tick labels={IMPORTANT},
            extra x tick style={
                grid=major,
                tick label style={
                    rotate=90,
                    anchor=west,
                },
                tick pos = right,
                ticklabel pos = right,
            },
            width=120mm,
            height=80mm,
            xlabel=Time,
            ylabel=Amplitude,
        ]
        \addplot+[
            ycomb,
            domain=-3e-3:3e-3,
            samples=11,
            every mark/.style={fill=white},
        ] 
        {exp(-x^2 / (2e-3^2)) / (1e-3 * sqrt(2*pi))};
    \end{axis}
\end{tikzpicture}
\end{document}

不幸的是,这导致 x 轴和其标签之间出现了一个难看的间隙(时间),如下所示:

当前结果

我设法找到了一种解决方法,通过手动定位 x 轴标签并添加以下代码来获得所需的结果:

xlabel style={at={(0.5,-2ex)}},

这导致了我发布的第一张图片。然而,这对我来说似乎相当不雅。首先,我还没有找到默认的垂直偏移量应该是多少,以便通过这种方法创建的图的 x 轴标签的垂直偏移量与所有其他图相同,而无需手动干预(以便所有图在这方面看起来相同),其次,手动执行此操作似乎……是错误的(是的,我知道,听起来有点傻)。

实际问题

所以,我的问题可以归结为以下两点:

  • 有没有办法避免这种额外的垂直间隙并自动pgfplots做“正确”的事情,或者
  • 如果我必须手动执行此操作,那么正确的(默认)垂直偏移量是多少,以便自动放置轴标签的图和手动放置的图的轴标签位于同一位置(我认为这是有记录的某处,但我在搜索中还没有偶然发现它)?

显然,对第一个问题给出适当的解决方案会更好。

我已经搜索过pgfplots、等的各种排列,但到目前为止还没有找到gapaxis label

答案1

到目前为止,我想不出 100% 自动的解决方案。“问题”在于, 的位置xlabel也考虑到了extra x ticks。不幸的是,它没有考虑到样式修改ticklabel pos=right,所以我们必须以某种方式撤消它。

我使用了TikZ 的widthheight函数来相应地移动标签,但当然必须为上述函数提供一些值,这是此解决方案的“非 100% 自动”部分。当然,在多个情况下,extra x ticks您必须为函数提供最宽的文本width才能使其工作。

为了证明这能得到所需的结果,我将此解决方案与另一个解决方案重叠,并extra x tick labels通过另一种方法添加了。如您所见,这两个解决方案之间只剩下很小的偏移,我认为这是可以接受的。

% used PGFPlots v1.14
\documentclass[margin=5pt]{standalone}
\usepackage{pgfplots}
    \pgfplotsset{compat=1.11}
\begin{document}
\begin{tikzpicture}
    \begin{axis}[
            extra x ticks={-0.0012},
            extra x tick labels={IMPORTANT},
            extra x tick style={
                grid=major,
                tick label style={
                    rotate=90,
                    anchor=west,
                },
                tick pos=right,
                ticklabel pos=right,
            },
            width=120mm,
            height=80mm,
            xlabel=Time,
            ylabel=Amplitude,
            % Because also the `extra x ticks' are taken into account for the
            % position of the `xlabel' (but not the fact that
            % `ticklabel pos=right' is used) this has to be "undone". To do so
            % we can use the `width' and `height' functions ...
            xlabel style={
                yshift = {width("IMPORTANT") - height("0") },
            },
        ]
        \addplot+[
            ycomb,
            domain=-3e-3:3e-3,
            samples=11,
            every mark/.style={fill=white},
        ] {exp(-x^2 / (2e-3^2)) / (1e-3 * sqrt(2*pi))};
    \end{axis}
    % -------------------------------------------------------------------------
    % for debugging purposes only
    % ---------------------------------
    % here I produce the desired result with a different approach to "know" where
    % the `xlabel' would be placed without the `extra x ticks'.
    \begin{axis}[
        extra x ticks={-0.0012},
        extra x tick labels={},
        extra x tick style={
            grid=major,
        },
        width=120mm,
        height=80mm,
        xlabel=Time,
        ylabel=Amplitude,
        xlabel style={
            red,
        },
        clip mode=individual,
    ]
        \addplot+[
            ycomb,
            domain=-3e-3:3e-3,
            samples=11,
            every mark/.style={fill=white},
        ] {exp(-x^2 / (2e-3^2)) / (1e-3 * sqrt(2*pi))};

        \node [rotate=90,anchor=west] at ( {axis description cs:0,1} -| -0.0012,0 ) {IMPORTANT};
    \end{axis}
    % -------------------------------------------------------------------------
\end{tikzpicture}
\end{document}

该图显示了上述代码的结果

相关内容