pgfplots height=,它有什么用处?

pgfplots height=,它有什么用处?

我对密钥的理解height=是,这将固定图的高度,并且y=值将相应调整。但是,事实似乎并非如此。

下面的两个图都已height=5cm指定,并且我已经控制了ytick=yticklabels=以确保它们不会影响总高度,但高度仍然存在明显差异:

enter image description here

我不认为这是一个四舍五入的问题,因为我可以y=手动计算值并且一切正常:

enter image description here

问题:

  • height=如果我对密钥的工作方式的想法有问题,我该如何y=根据height=ymax=ymin密钥自动计算值,以便我可以实现第二个测试用例的输出,而不必在进行y=绘图之前手动计算。

代码:height=

\documentclass[border=2pt]{standalone}
\usepackage{pgfplots}

\newcommand*{\DrawBoundingBox}{%
    \draw [black]
    ([shift={(-5pt,-5pt)}]current bounding box.south west)
    rectangle
    ([shift={(5pt,+5pt)}]current bounding box.north east);
}


\begin{document}

\begin{tikzpicture}
    \begin{axis}[
        axis lines=middle,
        ymin=-1,
        ymax=2.1,
        ytick={1},%         Ensure that the y ticks and labels are
        yticklabels={1},%   NOT effecting the height of the plot
        height=5cm,
    ]
    \addplot[domain=-2:3, ultra thick, blue]{0.5};
    \end{axis}
    \DrawBoundingBox%
\end{tikzpicture}
~%
\begin{tikzpicture}
    \begin{axis}[
        axis lines=middle,
        ymin=-1,
        ymax=5.5,
        ytick={1},%         Ensure that the y ticks and labels are
        yticklabels={1},%   NOT effecting the height of the plot
        height=5cm,
    ]
    \addplot[domain=-2:3, ultra thick, red]{4.25};
    \end{axis}
    \DrawBoundingBox%
\end{tikzpicture}
\end{document}

使用的代码计算y=

\documentclass[border=2pt]{standalone}
\usepackage{pgfplots}

\newcommand*{\DrawBoundingBox}{%
    \draw [black]
    ([shift={(-5pt,-5pt)}]current bounding box.south west)
    rectangle
    ([shift={(5pt,+5pt)}]current bounding box.north east);
}

\newlength{\PlotY}

\begin{document}

\pgfmathsetlength{\PlotY}{5cm/3.1}%  3.1 = ymax - ymin = 2 - (-1)
\begin{tikzpicture}
    \begin{axis}[
        axis lines=middle,
        ymin=-1,
        ymax=2.1,
        ytick={1},%         Ensure that the y ticks and labels are
        yticklabels={1},%   NOT effecting the height of the plot
        y=\PlotY,
    ]
    \addplot[domain=-2:3, ultra thick, blue]{0.5};
    \end{axis}
    \DrawBoundingBox%
\end{tikzpicture}
~%
\pgfmathsetlength{\PlotY}{5cm/6.5}% 6.5 = ymax - ymin = 5.5 - (-1)
\begin{tikzpicture}
    \begin{axis}[
        axis lines=middle,
        ymin=-1,
        ymax=5.5,
        ytick={1},%         Ensure that the y ticks and labels are
        yticklabels={1},%   NOT effecting the height of the plot
        y=\PlotY,
    ]
    \addplot[domain=-2:3, ultra thick, red]{4.25};
    \end{axis}
    \DrawBoundingBox%
\end{tikzpicture}
\end{document}

答案1

首先考虑一下pgfplots手册中的这句话(第 4.10.1 节常见的扩展选项):

请注意,pgfplots 仅估计轴和刻度标签所需的大小。该估计假设轴框外的任何内容都有固定的空间量。这会导致最终图像可能比规定的尺寸略大或略小。但是,固定量始终相同;它设置为 45pt。这意味着具有相同目标尺寸的多张图片的轴框大小相同——即使描述的大小有所不同。

因此,在第一种情况下,pgfplots将设置 y 单位,使 y 轴的高度(仅轴框,不包括描述)为 5cm - 45pt = 97.26pt。在第二种情况下,您已将 y 单位设置为高度为 5cm = 142.26pt。

现在,让我们添加并查看第二个(最高的一个)xticklabel style={draw}的输出,并使用各种设置:tikzpicture

  1. 您的第一个案例:

    enter image description here

    请注意,xticklabels 的节点略微突出于 y 轴的底部。这显然不会发生在第一个 中tikzpicture,其中ymax=2.1。因此,tikzpicture与第一个相比,第二个的边界框会稍微延伸一点。

  2. axis lines*=middle

    enter image description here

    请注意,刻度仅位于轴的内部,刻度标签不会因刻度而向下移动。因此,标签不再位于 y 轴下方。

  3. 使用scale only axis,或者您的y=\PlotY

    enter image description here

    因为整个 y 轴长 45pt,所以 0 以下的部分也更长,并且有空间容纳刻度标签。

  4. 使用\pgfmathsetlength{\PlotY}{(5cm-45)/6.5},对应的是pgfplots

    enter image description here

  5. 您的第一个案例,但ymin=-1.2改为ymin=-1

    enter image description here

    因为 y 轴的较大部分低于 0,所以pt从 y=0 到 y 轴底部的距离(以 为单位)较长,因此有足够的空间容纳刻度标签。

我认为,总而言之,问题的原因是多种因素的结合,例如

  • ticklabel 节点的总高度
  • 轴的高度
  • 轴限值
  • 勾选位置

当它们相互作用时,使得 ticklabel 节点在一种情况下扩展边界框,而在另一种情况下不扩展,则会得到 s 的高度差异tikzpicture

那么你会怎么做?我想只要你使用,axis lines=middle你就必须以某种方式确保 y 轴低于 0 的部分足够长,以便有足够的空间放置刻度标签。另一种可能的方法是将选项添加overlay到刻度标签节点,这样它们就不会影响边界框,然后使用类似于\DrawBoundingBox宏的东西手动设置边界框。不过,我目前还没有什么好主意。


另外:您可能会注意到 ticklabel 的节点比 的节点-22。例如,typeset ticklabels with strut如果您想避免这种情况,可以使用该选项。这将大大增加节点的总高度,因此可以inner ysep=0另外考虑。

相关内容