Die Daten, mit denen ich spiele, stammen aus der unten aufgeführten Internetquelle
nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv", sep=",")
Ich möchte ein 2D-Punktdiagramm erstellen, in dem zwei Metriken aus dieser Tabelle verglichen werden, wobei jeder Spieler einen Punkt auf dem Diagramm darstellt. Ich habe folgenden Code:
nbaplot <- ggplot(nba, aes(x= MIN, y= PTS, colour="green", label=Name)) +
geom_point()
Das gibt mir folgendes:
Was ich will, ist ein Etikett mit dem Namen des Spielers direkt neben den Punkten. Ich dachte, die Label-Funktion in ggplots Ästhetik würde das für mich tun, aber das tat es nicht.
Ich habe auch die Funktion text()
und die Funktion textxy()
von library(calibrate)
ausprobiert, von denen keine mit ggplot zu funktionieren scheint.
Wie kann ich diesen Punkten Namensschilder hinzufügen?
Verwenden Sie geom_text
Mit der Bezeichnung aes
. Sie können mit hjust, vjust
Spielen, um die Textposition anzupassen.
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)
Das Paket ggrepel
eignet sich hervorragend, um überlappende Textbeschriftungen voneinander zu entfernen. Sie können entweder geom_label_repel()
(zeichnet Rechtecke um den Text) oder geom_text_repel()
verwenden.
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)
Erstellt am 01.05.2019 von reprex package (v0.2.0).
Anstatt das ifelse wie im obigen Beispiel zu verwenden, kann man die Daten auch vor dem Beschriften anhand einiger Schwellenwerte vorfiltern, was dem Plotter viel Arbeit spart:
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))