ggplot图例问题:使用geom_point和geom_text时出现的问题。

16

我试图使用geom_point来说明我的数据计数。 我还想在图表中用geom_text注释其中的一些点。 当我添加geom_text时,似乎它正在图例中的点下面绘制一些东西。 我已尝试反转图层顺序但没有成功。 我无法理解为什么会出现这种情况。 有人见过这种情况吗?

set.seed(42)
df <- data.frame(x = 1:10
    , y = 1:10
    , label = sample(LETTERS,10, replace = TRUE)
    , count = sample(1:300, 10, replace = FALSE)
)

p <- ggplot(data = df, aes(x = x, y = y, size = count)) + geom_point()
p + geom_text(aes(label = label, size = 150, vjust = 2))

alt text

2个回答

25

我经常遇到这样的情况。关键是要知道 aes() 将数据映射到美学属性上。如果没有数据可映射(例如,如果您有一个确定的单一值),就没有理由使用 aes()。我相信只有在 aes() 内部的内容才会显示在图例中。

此外,在 ggplot(aes()) 中指定映射后,这些映射将应用于每个子层。对于 x 和 y 来说很好,因为 geom_pointgeom_text 都使用它们。但对于 size = count,它只适用于点层。

以下是我防止出现这种情况的两条规则:

  1. 只将基于数据的映射放入 aes() 中。如果参数采用一个预定的单一值,请将其传递到 不在 aes() 中的层。
  2. 仅为将使用数据的那些层映射数据。推论:只有在您确信每个子层都会使用数据时,才在 ggplot(aes()) 内部映射数据。否则,在层级别上进行映射。

因此,我会这样绘制:

p <- ggplot(data = df, aes(x = x, y = y)) + geom_point(aes(size = count)) 
p + geom_text(aes(label = label), size = 4, vjust = 2) 

2
你的两个规则很相关! - kohske
非常有用的技巧,我仍在努力理解使用ggplot2的最佳实践。您有关于子集数据对象以绘图的任何建议吗?例如,如果您只想注释第一个和最后一个点怎么办?我一直在使用类似geom_text(data = df[grep("xxx", df$label) , ] , aes(x = ...))的东西。有更好的方法来做到这一点吗? - Chase
追逐 - 这是一个好问题。最好将其作为一个新问题提出来;我有一些模糊的想法,但很可能有人有一个具体的想法。 - Matt Parker
directlabels包可以方便地进行自定义注释,如果我没记错的话。 - baptiste

19

或者,如果您需要在 aes 中指定文本的大小,则可以使用 legend = FALSE 来禁止绘制 geom 的图例:

p <- ggplot(data = df, aes(x = x, y = y, size = count)) + geom_point()
p + geom_text(aes(label = label, size = 150, vjust = 2), show_guide = FALSE)

1
啊,我从来没有想过在层级上使用那个。做得好。 - Matt Parker
2
小提示:在geom_XXX和stat_XXX中,“legend”参数已被“show_guides”替换。使用show_guide = TRUE或show_guide = FALSE来显示或禁止指南的显示。 - Andreas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接