184

每次我使用 ggplot 绘制绘图时,我都会花一点时间尝试不同的 hjust 和 vjust 值,例如

+ opts(axis.text.x = theme_text(hjust = 0.5))

让轴标签在轴标签几乎接触轴的位置对齐,并且与轴齐平(可以说是与轴对齐)。但是,我真的不明白发生了什么。通常,hjust = 0.5会给出与 的结果截然不同的结果hjust = 0.6,例如,我无法仅通过使用不同的值来弄清楚。

谁能指出我对 hjust 和 vjust 选项如何工作的全面解释?

4

2 回答 2

333

hjust和的值vjust仅定义在 0 和 1 之间:

  • 0 表示左对齐
  • 1 表示右对齐

资料来源:ggplot2,Hadley Wickham,第 196 页

(是的,我知道在大多数情况下,您可以在此范围之外使用它,但不要期望它以任何特定方式运行。这超出了规范。)

hjust控制水平对齐和vjust控制垂直对齐。

一个例子应该清楚地说明这一点:

td <- expand.grid(
    hjust=c(0, 0.5, 1),
    vjust=c(0, 0.5, 1),
    angle=c(0, 45, 90),
    text="text"
)

ggplot(td, aes(x=hjust, y=vjust)) + 
    geom_point() +
    geom_text(aes(label=text, angle=angle, hjust=hjust, vjust=vjust)) + 
    facet_grid(~angle) +
    scale_x_continuous(breaks=c(0, 0.5, 1), expand=c(0, 0.2)) +
    scale_y_continuous(breaks=c(0, 0.5, 1), expand=c(0, 0.2))

在此处输入图像描述


要了解更改hjust轴内文本时会发生什么,您需要了解轴文本的水平对齐方式不是与 x 轴相关,而是与整个绘图(其中包括 y 轴文本)相关。(在我看来,这是不幸的。相对于轴对齐会更有用。)

DF <- data.frame(x=LETTERS[1:3],y=1:3)
p <- ggplot(DF, aes(x,y)) + geom_point() + 
    ylab("Very long label for y") +
    theme(axis.title.y=element_text(angle=0))


p1 <- p + theme(axis.title.x=element_text(hjust=0)) + xlab("X-axis at hjust=0")
p2 <- p + theme(axis.title.x=element_text(hjust=0.5)) + xlab("X-axis at hjust=0.5")
p3 <- p + theme(axis.title.x=element_text(hjust=1)) + xlab("X-axis at hjust=1")

library(ggExtra)
align.plots(p1, p2, p3)

在此处输入图像描述


vjust要探索轴标签对齐会发生什么:

DF <- data.frame(x=c("a\na","b","cdefghijk","l"),y=1:4)
p <- ggplot(DF, aes(x,y)) + geom_point()

p1 <- p + theme(axis.text.x=element_text(vjust=0, colour="red")) + 
        xlab("X-axis labels aligned with vjust=0")
p2 <- p + theme(axis.text.x=element_text(vjust=0.5, colour="red")) + 
        xlab("X-axis labels aligned with vjust=0.5")
p3 <- p + theme(axis.text.x=element_text(vjust=1, colour="red")) + 
        xlab("X-axis labels aligned with vjust=1")


library(ggExtra)
align.plots(p1, p2, p3)

在此处输入图像描述

于 2011-09-01T07:44:32.910 回答
19

最权威的可能是 ggplot2 书的图 B.1(d),其附录可在http://ggplot2.org/book/appendices.pdf获得。

在此处输入图像描述

然而,事情并不是那么简单。 hjust并且vjust如上所述,它是如何工作的geom_texttheme_text有时)。考虑它的一种方法是考虑文本周围的一个框,以及参考点相对于该框的位置,以相对于框的大小为单位(因此对于不同大小的文本不同)。一个hjust0.5 和一个vjust0.5 将框居中在参考点上。Reducehjust将框向右移动框宽度乘以0.5-hjust。因此,当 时hjust=0,框的左边缘位于参考点。增加hjust将盒子向左移动盒子宽度的数量hjust-0.5。什么时候hjust=1,盒子从中心向左移动半个盒子宽度,将右边缘放在参考点上。如果hjust=2,则框的右边缘是参考点左侧的2-0.5=1.5框宽度(中心是参考点左侧的框宽度。对于垂直,较少是向上,更多是向下。这实际上是图 B.1(d ) 说,但它推断超出 [0,1]。

但是,有时这不起作用。例如

DF <- data.frame(x=c("a","b","cdefghijk","l"),y=1:4)
p <- ggplot(DF, aes(x,y)) + geom_point()

p + opts(axis.text.x=theme_text(vjust=0))
p + opts(axis.text.x=theme_text(vjust=1))
p + opts(axis.text.x=theme_text(vjust=2))

后三个地块是相同的。我不知道为什么会这样。此外,如果文本被旋转,那么它会更复杂。考虑

p + opts(axis.text.x=theme_text(hjust=0, angle=90))
p + opts(axis.text.x=theme_text(hjust=0.5 angle=90))
p + opts(axis.text.x=theme_text(hjust=1, angle=90))
p + opts(axis.text.x=theme_text(hjust=2, angle=90))

第一个使标签左对齐(相对于底部),第二个使它们在某个框中居中,因此它们的中心对齐,第三个使它们右对齐(因此它们的右侧对齐在轴旁边)。最后一个,好吧,我无法以连贯的方式解释。它与文本的大小、最宽文本的大小有关,我不确定还有什么。

于 2011-08-31T23:09:24.423 回答