【问题标题】:How to annotate facets but not margins in ggplot2如何在ggplot2中注释构面而不是边距
【发布时间】:2013-10-16 17:34:57
【问题描述】:

如何唯一地注释每个主要方面,但在相应的边距方面没有注释?以下代码将文本放置在我想要的主要方面,但边距显示叠加的文本。如何隐藏边距方面的文本?

frame_labels <- data.frame(
  frame = LETTERS[1:4],
  vs = rep(0:1, each = 2),
  am = rep(0:1, times = 2),
  x = 5, y = 33)

p <- ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point()
p <- p + facet_grid(vs ~ am, margin = TRUE, as.table = FALSE)
p <- p + geom_text(data = frame_labels, aes(x = x, y = y, label = frame))
print(p)

【问题讨论】:

  • 如果你想这样做,你可能需要预处理数据集。请参阅温斯顿在this thread 上的回答。
  • 谢谢@aosmith,我看到了那个帖子,但我不明白。我将其解释为向 geom_text data.frame 中称为“ALL”的构面变量添加一个额外的级别。我无法得到与他的评论一致的几件事。

标签: r annotations ggplot2 facet


【解决方案1】:

我对@9​​87654321@ 的看法是,您必须基本上将“边距”放入数据集中。我确信有一种优雅的方法可以做到这一点,但它现在正在逃避我。这是一种“蛮力”方法,似乎有效,但并不漂亮。

基本上我制作了三个额外的数据集副本,并在vsam 中添加第三层以合并边距。然后我rbind他们一起。起初我认为它不起作用,但我意识到我需要更改vs 的级别顺序,以便反向顺序与您示例中的顺序相匹配。然后,您的数据集 frame_labels 就像添加标签的魅力一样。

mtcars2 = mtcars3 = mtcars4 = mtcars
mtcars2$vs = mtcars3$am = mtcars4$am = mtcars4$vs = "all"
mtcarsall = rbind(mtcars, mtcars2, mtcars3, mtcars4)

mtcarsall$vs = factor(mtcarsall$vs, levels = c("all", "0", "1"))

ggplot(mtcarsall, aes(x = wt, y = mpg)) + geom_point() + 
    facet_grid(vs ~ am, as.table = FALSE)+
    geom_text(data = frame_labels, position = NULL, aes(x = x, y = y, label = frame))

【讨论】:

  • 太棒了!蛮力与否,它可以完成工作。非常感谢@aosmith!
【解决方案2】:

只需删除 geom_text(...) 部分。

代码应该看起来像这样才能获得所需的输出

library(ggplot2)

frame_labels <- data.frame(
frame = LETTERS[1:4],
vs = rep(0:1, each = 2),
am = rep(0:1, times = 2),
x = 5, y = 33)

p <- ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point()
p <- p + facet_grid(vs ~ am, margin = TRUE, as.table = FALSE)
print(p)

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 2012-12-04
    • 2016-06-19
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多