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:
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?
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)
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)
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()
### 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).
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))