Beri label titik di geom_point

178

Data yang saya mainkan berasal dari sumber internet yang tercantum di bawah ini

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

Yang ingin saya lakukan, adalah membuat grafik titik 2D membandingkan dua metrik dari tabel ini, dengan masing-masing pemain mewakili sebuah titik pada grafik. Saya memiliki kode berikut:

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

Ini memberi saya yang berikut:

NBA Plot

Yang saya inginkan adalah label nama pemain tepat di sebelah titik-titik. Saya pikir fungsi label dalam estetika ggplot akan melakukan ini untuk saya, tetapi ternyata tidak.

Saya juga mencoba text()fungsi dan textxy()fungsinya library(calibrate), yang keduanya tidak berfungsi dengan ggplot.

Bagaimana saya bisa menambahkan label nama ke titik-titik ini?

Setan Hijau
sumber

Jawaban:

280

Gunakan geom_text, dengan aeslabel. Anda dapat bermain dengan hjust, vjustuntuk menyesuaikan posisi teks.

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

masukkan deskripsi gambar di sini

EDIT: Label hanya nilai di atas ambang tertentu:

  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)

bagan dengan label bersyarat

agstudy
sumber
4
Apakah ada cara untuk menggeser label di sekitar (menghindarinya sedikit), sehingga mereka tidak tumpang tindih?
Thomas Browne
2
Saya tidak berpikir ada solusi mudah di dalamnya ggplot2. Mungkin ini bisa membantu Anda.
agstudy
1
Apakah ada cara untuk hanya memberi label poin di atas nilai tertentu, misalnya PTS lebih besar dari 24 pada plot di atas?
ONeillMB1
singkat 'menghindari' dengan benar, pertimbangkan ini hjust = -0.1untuk mendapatkan label yang dicetak sedikit jauh dari titik data.
Patrick T
Untuk menggeser label, pertimbangkan ggrepel .
Homer White
92

The ggrepelpaket karya besar untuk memukul mundur tumpang tindih label teks dari satu sama lain. Anda dapat menggunakan geom_label_repel()(menggambar kotak di sekitar teks) atau geom_text_repel()fungsi.

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

masukkan deskripsi gambar di sini

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

Sunting: Untuk digunakan ggrepeldengan garis, lihat ini dan ini .

Dibuat pada 2019-05-01 oleh paket reprex (v0.2.0).

Tung
sumber
1
Rapi! Saya sangat suka plot pertama. Saya mencoba ini dengan data saya dan saya senang dengan hasilnya kecuali bahwa legenda menunjukkan "a" bukan bentuk yang ditunjukkan dalam plot. (Saya menggunakan bentuk estetika untuk membedakan poin berdasarkan suatu faktor)
lebah
2
Saya memecahkan masalah ini sekarang dengan (a) mengekstraksi legenda plot tanpa geom_label_repel stackoverflow.com/questions/12041042/... dan (b) menambahkannya kemudian dengan gridExtra :: grid.arrange ke plot dengan label. Jika Anda tahu solusi yang lebih sederhana, saya masih akan menghargai itu!
lebah
1
@beeguy: tidak yakin saya mendapatkan apa yang Anda minta tetapi saya baru-baru ini melihat komit pada ggplot2dev yang menyebutkan hal serupa github.com/tidyverse/ggplot2/commit/… . Anda dapat mencoba menginstal kedua versi dev ggplot2& ggrepeluntuk melihat apakah masalah Anda telah diperbaiki
Tung
1
@beeguy: fyi ada juga lemonpaket yang sangat bagus dalam memanipulasi legenda plot.
Tung
1
Terima kasih atas ujung
pria lebah
10

Alih-alih menggunakan ifelse seperti pada contoh di atas, kita juga dapat memfilter data sebelum pelabelan berdasarkan beberapa nilai ambang, ini menghemat banyak pekerjaan untuk perangkat plot:

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