首页 文章

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

提问于
浏览
121

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

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

使轴标签在轴标签几乎接触轴的位置排成一行,并与轴齐平(可以说是轴对齐) . 但是,我还没有继续 . 通常情况下, hjust = 0.5 会给出与 hjust = 0.6 截然不同的结果,例如,我只是通过玩不同的值来解决这个问题 .

有人能指出我对hjust和vjust选项如何工作的全面解释吗?

2 回答

  • 207

    可能最明确的是ggplot2书的 Figure B.1(d) ,其附录可在http://ggplot2.org/book/appendices.pdf获得 .

    enter image description here

    然而,它并不那么简单 . hjustvjust 如上所述,它在 geom_texttheme_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))
    

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

  • 12

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

    enter image description here


    要了解更改轴文本中的 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)
    

    enter image description here


    要探索轴标签的 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)
    

    enter image description here

相关问题