使用ggplot进行绘图时,hjust和vjust会做什么?

每次我使用ggplot做一个情节,我花了一点时间,尝试不同的值为hjust和vjust在一行

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

使轴标签与轴标签几乎接触到轴的位置alignment,并与之alignment(可以说与轴alignment)。 但是,我不太明白发生了什么事。 通常情况下, hjust = 0.5给出了如此显着不同的结果,例如,我不能仅仅通过玩弄不同的值来解决这个问题。

任何人都可以点我全面解释如何调整和调整选项的工作?

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

  • 0意味着左alignment
  • 1表示右alignment

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

(是的,我知道在大多数情况下,你可以在这个范围之外使用它,但不要期望它有任何特定的行为,这是不符合规范的)。

hjust控制水平alignment和vjust控制垂直alignment。

一个例子应该明确这一点:

 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时会发生什么情况,您需要了解轴文本的水平alignment不是关于x轴,而是关于整个图(其中包括y轴文本) 。 (在我看来,这是不幸的,相对于轴线的alignment会更有用。)

 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) 

在这里输入图像说明


为了探索如何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) 

在这里输入图像说明

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

在这里输入图像说明

但是,这并不那么简单。 hjustvjust所描述的是它是如何工作在geom_texttheme_text (有时)。 考虑一个方法是在文本周围考虑一个盒子,参考点与盒子相关的位置,以盒子大小为单位(因此对于不同大小的文本是不同的)。 在参考点上,0.5的hjust和0.5的vjust使盒子居中。 减lesshjust将框的宽度乘以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)) 

第一个标签左alignment(底部),第二个让他们居中放在一个盒子里,所以他们的中心排成一列,第三个让他们右alignment(所以他们的右边排列在轴旁边)。 最后一个,我不能以一致的方式解释。 这与文本的大小,最大文本的大小有关,我不确定还有什么。