在面板外添加ggplot注释?还是两个头衔?

时间:2014-02-24 19:58:48

标签: r ggplot2

我正在使用ggplot2animation包制作动画情节。动画的每一帧都包含一个包含两位信息的地图,我想将其用作标题/标签。

在我看来,有两种方法可以做到这一点。

  1. 调整绘图边距,使其没有标题边距,然后使用geom_text将“标题”添加为绘图上的文本注释。
  2. 添加第二个标题。 (我尝试用空格填充单个标题来模拟两个标题,但由于字距调整,这会因重复绘图而中断。)
  3. 第一种方法并不理想,因为我需要为每个帧使用相同的绘图限制,并且我从以lat / long测量的地图范围中获得这些。确定标签所需的额外高度会导致丑陋的单位混合。因此,添加第二个标题在语义上对我来说更明智,但在使用annotation_custom之后,我似乎无法弄明白。

    这是我所追求的模型,展示了两个“标题”,每个标题都有不同的对齐方式,以确保它们在重复的帧中保持不变。我打开了情节边框来帮助想象这个位置。在最终的情节中,这将被删除。

    Mock-up of ggplot with two titles

    感谢您的帮助!

    修改

    感谢Baptiste的签名发布。我不得不使用稍微不同的参数来(a)获得正确的定位和(b)对两个标题使用相同的字体。这是一个例子:

    require(gtable)
    require(ggplot2)
    
    ## Create the basic plot
    df <- data.frame(x=1:10, y=1:10)
    gg <- ggplot(df, aes(x,y)) + geom_point() + labs(title="Left") +
        theme(plot.title=element_text(hjust=0))
    
    ## Get the title style from the original plot
    g <- ggplotGrob(gg)
    title_style <- g$grobs[[8]]$gp
    
    ## Add the second title and plot
    g2 <- gtable_add_grob(g, textGrob("Right", x=1, hjust=1, gp=title_style),
                          t=2, l=4, b=2, r=4, name="right-title")
    grid.draw(g2)
    

    结果如下:

    ggplot figure with two titles

3 个答案:

答案 0 :(得分:10)

试试这个

p = qplot(1,1) 
g = ggplotGrob(p)

require(gtable)
g = gtable_add_grob(g, grobTree(textGrob("left", x=0, hjust=0), 
                                textGrob("right", x=1, hjust=1)), 
                    t=1, l=4)

grid.draw(g)

答案 1 :(得分:1)

基于grid

的解决方案
require(ggplot2)
require(grid)

df <- data.frame(x = 1:10, y = 1:10)
gg <- ggplot(df, aes(x, y)) + geom_point() + labs(title = "Left") +
    theme(plot.title = element_text(hjust = 0))
gg
grid.text("Right", x = unit(0.95, "npc"), y = unit(0.96, "npc"))

答案 2 :(得分:0)

替代annotate并关闭剪辑(不推荐)

p = qplot(1,1) + annotate("text", label="left", 
                          x=-Inf, y=Inf, vjust=-1, hjust=0) 
g = ggplotGrob(p)
g$layout$clip[g$layout$name == "panel"] = "off"
grid.draw(g)