【问题标题】:Add ggplot annotation outside the panel? Or two titles?在面板外添加 ggplot 注释?还是两个称号?
【发布时间】:2014-03-26 16:52:34
【问题描述】:

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

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

  1. 调整绘图边距,使标题边距不存在,然后使用geom_text 在绘图上添加“标题”作为文本注释。
  2. 添加第二个标题。 (我尝试用空格填充单个标题来模拟两个标题,但由于字距调整,这会因重复的情节而崩溃。)

第一种方法并不理想,因为我需要为每一帧使用相同的绘图限制,并且我从以纬度/经度测量的地图范围中获得这些限制。确定标签所需的额外高度会导致难看的单元混搭。因此,添加第二个标题对我来说在语义上似乎更明智,但在玩了annotation_custom 之后,我似乎无法弄清楚。

这是我所追求的模型,显示了两个“标题”,每个标题都有单独的对齐方式,以确保它们在重复的帧中保持原位。我打开了绘图边框以帮助可视化位置。在最终的情节中,这将被删除。

感谢您的帮助!

编辑

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

结果如下:

【问题讨论】:

  • 我尝试使用 title_style 但我需要我的 grob 与标题的其余部分颜色不同,所以我无法从标题或任何其他文本中获取样式我的图表。有没有其他方法可以改变 grob 的颜色?

标签: r ggplot2


【解决方案1】:

试试这个

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)

【讨论】:

  • 请您解释一下如何选择 t 和 l 的值。例如,将 l 设置为 3 或 5 会给出完全不同的结果。
  • t 和 l 分别代表顶部和左侧,它们对应于 gtable 布局(单元格矩阵)中您希望插入 grob 的位置。我通过反复试验找到了索引(而是有根据的猜测),大致了解了典型 ggplot2 的布局(标题、轴、面板等),但您可以通过检查 g$layout 的名称以编程方式进行操作。
【解决方案2】:

基于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"))

【讨论】:

  • Stephan: 是否可以通过 ggsave() 保存使用 grid.text() 完成的注释?
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    相关资源
    最近更新 更多