выпуск легенды ggplot с geom_point и geom_text - PullRequest
16 голосов
/ 19 ноября 2010

Я пытаюсь использовать 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 голосов
/ 19 ноября 2010

Это случалось со мной все время. Хитрость заключается в том, что aes() отображает данные в эстетику. Если нет данных для сопоставления (например, если у вас есть одно значение, которое вы определяете), нет смысла использовать aes(). Я верю, что в вашей легенде появятся только вещи внутри 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) 
18 голосов
/ 19 ноября 2010

или, если вам нужно указать размер текста внутри 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)
...