使用ggplot进行绘图时,just和vjust有什么作用?


159

每次我使用ggplot进行绘图时,我都会花一些时间尝试在诸如

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

使轴标签对齐,使轴标签几乎与轴接触,并与轴齐平(可以说与轴对齐)。但是,我不太了解发生了什么。例如,通常会hjust = 0.5产生与截然不同的结果hjust = 0.6,以至于我无法仅仅通过使用不同的值来弄清楚。

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


1
我确实在第一个答案的注释中给出了一个具体示例。显然,使用0-1以外的数字是不确定的,如果不能解释为什么hjust = -1具有奇怪的行为,则至少可以解释认为是奇怪的。
威廉·冈恩

Answers:


277

的值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))

在此处输入图片说明


要了解更改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)

在此处输入图片说明


1
因此,对于angle = 45的情况,当我有长度不同的轴标签时,假设从25个字符到5个字符,它们都没有对齐到单词边界的右边或左边。看一下这里的轴如果我使用angle = 45,如何使它们右对齐并与轴齐平?
威廉·冈恩

我已经尝试过了,而且我的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更高。
威廉·冈恩

1
@WilliamGunn我建议您用您的代码发布一个新问题。
Andrie

1
由于不赞成使用opt,我们如何调整轴标题的位置?
赛勒斯·

1
@CyrusMohammadian,我已经编辑了此答案以使用当前的ggplot2语法。
Droplet

16

也许最确定的是ggplot2书的图B.1(d),其附录位于http://ggplot2.org/book/appendices.pdf

在此处输入图片说明

但是,它并不是那么简单。 hjustvjust描述有它是如何工作的geom_texttheme_text(有时)。想到它的一种方法是考虑文本周围的一个框,其中参考点相对于该框,以相对于框大小的单位为单位(因此,对于不同大小的文本而言,单位也不同)。一个hjust0.5和一个vjust0.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))

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


非常感谢,这对于angle = 90的情况很有帮助,但是我没有得到的是为什么当我使用angle = 45而不是angle = 90时标签的右对齐不再起作用。我了解angle = 45,hjust = 0的行为,但是angle = 45,hjust = -1只是奇怪。
威廉·冈恩

实际上,您的第一个示例确实有效。您认为它不起作用的原因是所有标签的高度都相同。再次尝试DF <- data.frame(x=c("a\na","b","cdefghijk","l"),y=1:4)- \n标题之一换行。
Andrie

@威廉,我想@安德烈是对的;hjust并且vjust仅在0和1之间定义;超出该范围的行为没有任何意义。
Brian Diggs

@安德里,你是对的。但是我仍然很难在轴标题/文本案例中建立连贯的思维模型。对于轴文本,hjust=0将左边缘与tic对齐;hjust=0.5以tic为中心;hjust=1将右边缘与tic对齐(相对于参考点的移动框)。但要在最高标签大小的盒子vjust对齐。
Brian Diggs

@BrianDiggs对于vjust轴标签,所有标签都同时对齐。因此,当时所有顶部边缘对齐,当时vjust=1所有底部边缘对齐vjust=0。这对我来说很有意义。
Andrie
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.