我对密钥的理解height=
是,这将固定图的高度,并且y=
值将相应调整。但是,事实似乎并非如此。
下面的两个图都已height=5cm
指定,并且我已经控制了ytick=
和yticklabels=
以确保它们不会影响总高度,但高度仍然存在明显差异:
我不认为这是一个四舍五入的问题,因为我可以y=
手动计算值并且一切正常:
问题:
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
您的第一个案例:
请注意,xticklabels 的节点略微突出于 y 轴的底部。这显然不会发生在第一个 中
tikzpicture
,其中ymax=2.1
。因此,tikzpicture
与第一个相比,第二个的边界框会稍微延伸一点。和
axis lines*=middle
:请注意,刻度仅位于轴的内部,刻度标签不会因刻度而向下移动。因此,标签不再位于 y 轴下方。
使用
scale only axis
,或者您的y=\PlotY
:因为整个 y 轴长 45pt,所以 0 以下的部分也更长,并且有空间容纳刻度标签。
使用
\pgfmathsetlength{\PlotY}{(5cm-45)/6.5}
,对应的是pgfplots
:您的第一个案例,但
ymin=-1.2
改为ymin=-1
:因为 y 轴的较大部分低于 0,所以
pt
从 y=0 到 y 轴底部的距离(以 为单位)较长,因此有足够的空间容纳刻度标签。
我认为,总而言之,问题的原因是多种因素的结合,例如
- ticklabel 节点的总高度
- 轴的高度
- 轴限值
- 勾选位置
当它们相互作用时,使得 ticklabel 节点在一种情况下扩展边界框,而在另一种情况下不扩展,则会得到 s 的高度差异tikzpicture
。
那么你会怎么做?我想只要你使用,axis lines=middle
你就必须以某种方式确保 y 轴低于 0 的部分足够长,以便有足够的空间放置刻度标签。另一种可能的方法是将选项添加overlay
到刻度标签节点,这样它们就不会影响边界框,然后使用类似于\DrawBoundingBox
宏的东西手动设置边界框。不过,我目前还没有什么好主意。
另外:您可能会注意到 ticklabel 的节点比 的节点-2
大2
。例如,typeset ticklabels with strut
如果您想避免这种情况,可以使用该选项。这将大大增加节点的总高度,因此可以inner ysep=0
另外考虑。