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

替代文字

4

2 回答 2

25

这一直发生在我身上。诀窍是知道aes()将数据映射到美学。如果没有要映射的数据(例如,如果您确定了一个值),则没有理由使用aes(). 我相信只有an里面的东西aes()才会出现在你的传奇中。

此外,当您在 内部指定映射时ggplot(aes()),这些映射将应用于每个后续层。这对您的 x 和 y 有好处,因为两者都geom_point使用geom_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) 
于 2010-11-19T01:07:36.533 回答
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)
于 2010-11-19T01:15:55.380 回答