每次我使用ggplot创建一个情节时,我会花一点时间尝试不同的值来调整hjust和vjust,如
+ opts(axis.text.x = theme_text(hjust = 0.5))
使轴标签在轴标签几乎接触轴的位置排成一行,并与轴齐平(可以说是轴对齐)。但是,我真的不明白发生了什么。通常,hjust = 0.5
会给hjust = 0.6
带来如此截然不同的结果,例如,我只是通过玩弄不同的值来解决这个问题。
有人能指出我对hjust和vjust选项如何运作的全面解释吗?
答案 0 :(得分:224)
hjust
和vjust
的值仅定义在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") +
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)
答案 1 :(得分:13)
可能最明确的是ggplot2书的图B.1(d),其附录可在http://ggplot2.org/book/appendices.pdf获得。
但是,它并不那么简单。如上所述,hjust
和vjust
在geom_text
和theme_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))
第一个标签左对齐(靠近底部),第二个让它们居中在某个框中,使它们的中心对齐,第三个让它们右对齐(所以它们的右边在轴旁边排列)。最后一个,好吧,我无法以连贯的方式解释。它与文本的大小,最宽文本的大小有关,我不知道还有什么。