Метки точек в geom_point

178

Данные, с которыми я играю, взяты из интернет-источника, указанного ниже

nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv", sep=",")

Что я хочу сделать, так это создать двухмерный график точек, сравнивая две метрики из этой таблицы, где каждый игрок представляет точку на графике. У меня есть следующий код:

nbaplot <- ggplot(nba, aes(x= MIN, y= PTS, colour="green", label=Name)) + 
                  geom_point() 

Это дает мне следующее:

Участок НБА

То, что я хочу, это ярлык с именем игрока рядом с точками. Я думал, что функция метки в эстетике ggplot сделает это для меня, но это не так.

Я также попробовал text()функцию и textxy()функцию из library(calibrate), ни один из которых не работает с ggplot.

Как я могу добавить ярлыки к этим точкам?

Зеленый Демон
источник

Ответы:

280

Используйте geom_text, с aesэтикеткой. Вы можете играть с, hjust, vjustчтобы настроить положение текста.

ggplot(nba, aes(x= MIN, y= PTS, colour="green", label=Name))+
  geom_point() +geom_text(aes(label=Name),hjust=0, vjust=0)

введите описание изображения здесь

РЕДАКТИРОВАТЬ: маркировать только значения выше определенного порога:

  ggplot(nba, aes(x= MIN, y= PTS, colour="green", label=Name))+
  geom_point() +
  geom_text(aes(label=ifelse(PTS>24,as.character(Name),'')),hjust=0,vjust=0)

диаграмма с условными метками

agstudy
источник
4
Есть ли способ сместить метки вокруг (слегка уклониться от них), чтобы они не перекрывали друг друга?
Томас Браун
2
Я не думаю, что есть какое-то простое решение внутри ggplot2. Может быть, это может помочь вам.
Агстуди
1
Есть ли способ маркировать только точки выше определенного значения, например, PTS больше 24 на графике выше?
ONeillMB1
Если не считать правильного «уклонения», учтите это, hjust = -0.1чтобы немного отодвинуть напечатанные этикетки от точки данных.
PatrickT
Чтобы переместить метки вокруг, рассмотрите ggrepel .
Гомер Уайт
92

ggrepelПакет работает отлично подходит для отпугивания перекрывающихся текстовых меток на расстоянии друг от друга. Вы можете использовать либо geom_label_repel()(рисует прямоугольники вокруг текста), либо geom_text_repel()функции.

library(ggplot2)
library(ggrepel)

nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv", sep = ",")

nbaplot <- ggplot(nba, aes(x= MIN, y = PTS)) + 
  geom_point(color = "blue", size = 3)

### geom_label_repel
nbaplot + 
  geom_label_repel(aes(label = Name),
                  box.padding   = 0.35, 
                  point.padding = 0.5,
                  segment.color = 'grey50') +
  theme_classic()

введите описание изображения здесь

### geom_text_repel
# only label players with PTS > 25 or < 18
# align text vertically with nudge_y and allow the labels to 
# move horizontally with direction = "x"
ggplot(nba, aes(x= MIN, y = PTS, label = Name)) + 
  geom_point(color = dplyr::case_when(nba$PTS > 25 ~ "#1b9e77", 
                                      nba$PTS < 18 ~ "#d95f02",
                                      TRUE ~ "#7570b3"), 
             size = 3, alpha = 0.8) +
  geom_text_repel(data          = subset(nba, PTS > 25),
                  nudge_y       = 32 - subset(nba, PTS > 25)$PTS,
                  size          = 4,
                  box.padding   = 1.5,
                  point.padding = 0.5,
                  force         = 100,
                  segment.size  = 0.2,
                  segment.color = "grey50",
                  direction     = "x") +
  geom_label_repel(data         = subset(nba, PTS < 18),
                  nudge_y       = 16 - subset(nba, PTS < 18)$PTS,
                  size          = 4,
                  box.padding   = 0.5,
                  point.padding = 0.5,
                  force         = 100,
                  segment.size  = 0.2,
                  segment.color = "grey50",
                  direction     = "x") +
  scale_x_continuous(expand = expand_scale(mult = c(0.2, .2))) +
  scale_y_continuous(expand = expand_scale(mult = c(0.1, .1))) +
  theme_classic(base_size = 16)

Изменить: чтобы использовать ggrepelсо строками, увидеть это и это .

Создано в 2019-05-01 пакетом представлением (v0.2.0).

Tung
источник
1
Ухоженная! Мне очень нравится первый сюжет. Я попробовал это с моими данными, и я доволен результатом, за исключением того, что легенда показывает «а» вместо форм, показанных на графике. (Я использую эстетическую форму, чтобы различать точки в зависимости от фактора)
пчелиный парень
2
Я решил эту проблему сейчас, (а) извлекая легенду о графике без geom_label_repel stackoverflow.com/questions/12041042/… и (б) затем добавляя ее с помощью gridExtra :: grid.arrange к графику с метками. Если вы знаете более простое решение, я все равно буду признателен за это!
пчелиный парень
1
@beeguy: не уверен, что я понял то, что вы просите, но недавно я увидел коммит на ggplot2dev, в котором упоминалось нечто подобное github.com/tidyverse/ggplot2/commit/… . Вы можете попробовать установить обе версии dev ggplot2& &, ggrepelчтобы увидеть, исправлена ​​ли ваша проблема
Tung
1
@beeguy: кстати, есть lemonпакет, который очень хорош в манипулировании легендой сюжета.
Тун
1
Спасибо за совет
пчелиный парень
10

Вместо использования ifelse, как в приведенном выше примере, можно также предварительно отфильтровать данные перед маркировкой на основе некоторых пороговых значений, это сэкономит много работы для устройства печати:

xlimit <- 36
ylimit <- 24
ggplot(myData)+geom_point(aes(myX,myY))+
    geom_label(data=myData[myData$myX > xlimit & myData$myY> ylimit,], aes(myX,myY,myLabel))
Патрик Долан
источник