每次我使用ggplot进行绘图时,我都会花一些时间尝试在诸如
+ opts(axis.text.x = theme_text(hjust = 0.5))
使轴标签对齐,使轴标签几乎与轴接触,并与轴齐平(可以说与轴对齐)。但是,我不太了解发生了什么。例如,通常会hjust = 0.5
产生与截然不同的结果hjust = 0.6
,以至于我无法仅仅通过使用不同的值来弄清楚。
谁能指出我对调整和调整选项如何工作的全面解释?
每次我使用ggplot进行绘图时,我都会花一些时间尝试在诸如
+ opts(axis.text.x = theme_text(hjust = 0.5))
使轴标签对齐,使轴标签几乎与轴接触,并与轴齐平(可以说与轴对齐)。但是,我不太了解发生了什么。例如,通常会hjust = 0.5
产生与截然不同的结果hjust = 0.6
,以至于我无法仅仅通过使用不同的值来弄清楚。
谁能指出我对调整和调整选项如何工作的全面解释?
Answers:
的值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") +
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)
Error in grid.Call("L_textBounds", as.graphicsAnnot(x$label), x$x, x$y, : Polygon edge not found (zero-width or zero-height?)
追求vjust = .72
更高。
也许最确定的是ggplot2书的图B.1(d),其附录位于http://ggplot2.org/book/appendices.pdf。
但是,它并不是那么简单。 hjust
并vjust
描述有它是如何工作的geom_text
和theme_text
(有时)。想到它的一种方法是考虑文本周围的一个框,其中参考点相对于该框,以相对于框大小的单位为单位(因此,对于不同大小的文本而言,单位也不同)。一个hjust
0.5和一个vjust
0.5中心上的基准点的框。减少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))
第一个将标签左对齐(相对于底部),第二个标签将它们居中放置在某个框中,以使它们的中心对齐,第三个标签将它们右对齐(因此,其右侧在轴旁对齐)。最后一个,嗯,我无法以连贯的方式进行解释。它与文本的大小,最宽的文本的大小有关,我不确定还有什么。
DF <- data.frame(x=c("a\na","b","cdefghijk","l"),y=1:4)
- \n
标题之一换行。
hjust
并且vjust
仅在0和1之间定义;超出该范围的行为没有任何意义。
hjust=0
将左边缘与tic对齐;hjust=0.5
以tic为中心;hjust=1
将右边缘与tic对齐(相对于参考点的移动框)。但要在最高标签大小的盒子内vjust
对齐。
vjust
轴标签,所有标签都同时对齐。因此,当时所有顶部边缘对齐,当时vjust=1
所有底部边缘对齐vjust=0
。这对我来说很有意义。