it-swarm.com.de

Beschrifte Punkte in geom_point

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:

NBA Plot

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?

147
Green Demon

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)

enter image description here

BEARBEITEN: Beschriften Sie nur Werte über einem bestimmten Schwellenwert:

  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

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

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)

Erstellt am 01.05.2019 von reprex package (v0.2.0).

57
Tung

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