Noktaları geom_point olarak etiketleyin


178

Oynadığım veriler aşağıda listelenen İnternet kaynağından geliyor

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

Ne yapmak istiyorum, bu tablodaki iki metriği karşılaştıran bir 2D nokta grafiği oluşturmak, her oyuncu grafikte bir noktayı temsil ediyor. Takip koduna sahibim:

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

Bu bana şunları verir:

NBA Grafiği

Benim istediğim noktaların hemen yanında oyuncunun isminin bir etiketi. Ggplot'un estetiğindeki etiket işlevinin bunu benim için yapacağını düşündüm, ama olmadı.

Ben de ggplot ile çalışmak gibi görünüyor text()fonksiyonu ve textxy()fonksiyonu denedim library(calibrate).

Bu noktalara nasıl ad etiketi ekleyebilirim?

Yanıtlar:


280

Kullanım geom_textile, aesetiket. hjust, vjustMetin konumunu ayarlamak için ile oynayabilirsiniz .

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

resim açıklamasını buraya girin

EDIT: Yalnızca belirli bir eşiğin üzerindeki değerleri etiketleyin:

  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)

koşullu etiketler içeren grafik


4
Etiketleri, üst üste binmemek için kaydırmanın herhangi bir yolu var mı (hiç bu kadar hafifçe atlayın)?
Thomas Browne

2
İçinde kolay bir çözüm olduğunu düşünmüyorum ggplot2. Belki bu size yardımcı olabilir.
agstudy

1
Yalnızca belirli bir değerin üzerindeki noktaları etiketlemenin herhangi bir yolu var mı, örneğin yukarıdaki grafikte 24'ten büyük PTS?
ONeillMB1

düzgün bir şekilde 'kaçmak' hjust = -0.1için, yazdırılan etiketleri veri noktasından çok az uzaklaştırmak için bunu düşünün .
PatrickT

Etiketleri hareket ettirmek için ggrepel'i düşünün .
Homer White

92

ggrepelPaket birbirlerinden uzak örtüşen metin etiketlerini kovucu için harika çalışıyor. Ya geom_label_repel()(metnin etrafına dikdörtgenler çizer) ya da geom_text_repel()işlevleri kullanabilirsiniz.

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

resim açıklamasını buraya girin

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

Düzenleme:ggrepel Çizgilerle kullanmak için şu ve buna bakın .

2019-05-01 tarihinde reprex paketi tarafından oluşturuldu (v0.2.0).


1
Temiz! İlk komployu gerçekten seviyorum. Bunu verilerim ile denedim ve efsane çizimde gösterilen şekiller yerine "a" s göstermesi dışında sonuçtan memnunum. (Noktaları bir faktöre göre ayırt etmek için estetik bir şekil kullanıyorum)
arı adam

2
Bu sorunu şimdi (a) geom_label_repel stackoverflow.com/questions/12041042/… olmadan bir arsa efsanesini ayıklayarak ve (b) daha sonra gridExtra :: grid.arrange ile etiketli bir arsa ekleyerek çözdüm. Daha basit bir çözüm biliyorsanız, bunu takdir ediyorum!
arı adam

1
@beeguy: Sorduğunuz şeyden emin değilim ama son zamanlarda github.com/tidyverse/ggplot2/commit/… 'deggplot2 benzer bir şeyden bahseden dev konusunda bir taahhüt gördüm . Sen her iki dev sürümünü yüklemeye deneyebilirsiniz ggplot2& ggrepelSorunun sabit olup olmadığını görmek için
Tung

1
@beeguy: fyi ayrıca lemonarsa efsanesini manipüle etmede çok iyi bir paket var.
Tung

1
Bahşiş için teşekkür ederim
arı adam

10

Yukarıdaki örnekte olduğu gibi ifelse kullanmak yerine, bazı eşik değerlerine dayalı olarak etiketlemeden önce verileri önceden filtreleyebilirsiniz, bu, çizim cihazı için çok fazla iş tasarrufu sağlar:

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))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.