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

Wil*_*unn 143 plot r ggplot2

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

+ opts(axis.text.x = theme_text(hjust = 0.5))
Run Code Online (Sandbox Code Playgroud)

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

谁能指点我对hjust和vjust选项如何工作的全面解释?

And*_*rie 242

的值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))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


要了解更改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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


要探索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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Bri*_*ggs 14

可能最明确的是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))
Run Code Online (Sandbox Code Playgroud)

后三个图是相同的.我不知道为什么会这样.此外,如果文本被旋转,则更复杂.考虑

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))
Run Code Online (Sandbox Code Playgroud)

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