Позначення точок у geom_point


178

Дані, з якими я граю, надходять із переліченого нижче джерела Інтернету

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

Що я хочу зробити, це створити графік 2D балів, порівнюючи дві показники з цієї таблиці, при цьому кожен гравець представляє крапку на графіку. У мене є такий код:

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)

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

EDIT: Мітки лише для значень, що перевищують певний поріг:

  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)

діаграма з умовними позначками


4
Чи є спосіб пересунути етикетки навколо (злегка відхилятися від них), щоб вони не перекривались?
Томас Браун

2
Я не думаю, що всередині є якесь просте рішення ggplot2. Можливо, це може вам допомогти.
agstudy

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 пакетом reprex (v0.2.0).


1
Акуратно! Мені дуже подобається перший сюжет. Я спробував це зі своїми даними, і я задоволений результатом, за винятком того, що легенда показує "а" замість фігур, показаних у сюжеті. (Я використовую естетичну форму, щоб виділити точки за фактором)
бджолиний хлопець

2
Я вирішив цю проблему зараз, (а) екстрагування легенди сюжету без geom_label_repel stackoverflow.com/questions/12041042 / ... і (б) додавання його потім gridExtra :: grid.arrange до сюжету з етикетками. Якщо ви знаєте простіше рішення, я все одно вдячний би цьому!
хлопець бджоли

1
@beeguy: не впевнений, що я отримую те, про що ви запитуєте, але нещодавно я побачив прихильність до ggplot2розробника, який згадував подібну річ github.com/tidyverse/ggplot2/commit/… . Ви можете спробувати встановити обидві версії розробника ggplot2&, ggrepelщоб побачити, чи виправлена ​​ваша проблема
Tung

1
@beeguy: fyi також є 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))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.