web-dev-qa-db-fra.com

Label les points dans geom_point

Les données sur lesquelles je joue proviennent de la source Internet indiquée ci-dessous.

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

Ce que je veux faire, c'est créer un graphique de points 2D comparant deux mesures de ce tableau, chaque joueur représentant un point sur le graphique. J'ai le code suivant:

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

Cela me donne ce qui suit:

NBA Plot

Ce que je veux, c'est une étiquette du nom du joueur juste à côté des points. Je pensais que la fonction étiquette dans l'esthétique de ggplot ferait cela pour moi, mais ça ne l'a pas été.

J'ai aussi essayé la fonction text() et la fonction textxy() de library(calibrate), qui ne semblent pas fonctionner avec ggplot.

Comment puis-je ajouter des étiquettes de nom à ces points?

147
Green Demon

Utilisez geom_text, avec l'étiquette aes. Vous pouvez jouer avec hjust, vjust pour ajuster la position du texte.

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

enter image description here

EDIT: Étiquette uniquement les valeurs dépassant un certain seuil:

  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)

chart with conditional labels

234
agstudy

Le package ggrepel est très utile pour éloigner les libellés de texte qui se chevauchent. Vous pouvez utiliser les fonctions geom_label_repel() (dessine des rectangles autour du texte) ou 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()

enter image description here

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

Créé le 2019-05-01 par le paquetage reprex (v0.2.0).

57
Tung

Au lieu d'utiliser ifelse comme dans l'exemple ci-dessus, il est également possible de pré-filtrer les données avant de les étiqueter en fonction de certaines valeurs de seuil, ce qui épargne beaucoup de travail pour le dispositif de traçage:

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