使用ggplot创建绘图时,hjust和vjust会做什么?

时间:2011-08-31 21:46:28

标签: r plot ggplot2

每次我使用ggplot创建一个情节时,我会花一点时间尝试不同的值来调整hjust和vjust,如

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

使轴标签在轴标签几乎接触轴的位置排成一行,并与轴齐平(可以说是轴对齐)。但是,我真的不明白发生了什么。通常,hjust = 0.5会给hjust = 0.6带来如此截然不同的结果,例如,我只是通过玩弄不同的值来解决这个问题。

有人能指出我对hjust和vjust选项如何运作的全面解释吗?

2 个答案:

答案 0 :(得分:224)

hjustvjust的值仅定义在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))

enter image description here


要了解更改轴文本中的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") +
    opts(axis.title.y=theme_text(angle=0))


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

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

enter image description here


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

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

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


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

enter image description here

答案 1 :(得分:13)

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

enter image description here

但是,它并不那么简单。如上所述,hjustvjustgeom_texttheme_text(有时)中有效。想到它的一种方法是考虑文本周围的框,以及参考点与该框相关的位置,以相对于框大小的单位(因此对于不同大小的文本而言不同)。 0.5的hjust和0.5的vjust将参考点放在框的中心。缩小hjust会将框移动一个框宽度乘以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))

第一个标签左对齐(靠近底部),第二个让它们居中在某个框中,使它们的中心对齐,第三个让它们右对齐(所以它们的右边在轴旁边排列)。最后一个,好吧,我无法以连贯的方式解释。它与文本的大小,最宽文本的大小有关,我不知道还有什么。