ggplot图例问题w / geom_point和geom_text

时间:2010-11-19 00:46:16

标签: r ggplot2 legend

我正在尝试使用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 个答案:

答案 0 :(得分:25)

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

此外,当您在ggplot(aes())内指定映射时,这些映射将应用于每个后续层。这对你的x和y有好处,因为geom_pointgeom_text都使用它们。这对size = count不利,因为这只适用于这些点。

所以这些是我防止这类事情的两条规则:

  1. 仅将基于数据的映射放在aes()中。如果参数采用单个预定值,则将其传递给aes()层。
  2. 仅为将使用它的那些图层映射数据。推论:如果您确信每个后续层都将使用它,则仅在ggplot(aes())内部映射数据。否则,将其映射到图层级别。
  3. 所以我会这样画出来:

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

答案 1 :(得分:18)

或者,如果你需要在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)