ป้ายกำกับจุดใน geom_point


178

ข้อมูลที่ฉันเล่นด้วยมาจากแหล่งอินเทอร์เน็ตตามรายการด้านล่าง

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

สิ่งที่ฉันต้องการทำคือสร้างกราฟคะแนน 2D เปรียบเทียบตัวชี้วัดสองตัวจากตารางนี้โดยผู้เล่นแต่ละคนแสดงจุดเป็นจุดบนกราฟ ฉันมีรหัสต่อไปนี้:

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

สิ่งนี้ทำให้ฉันต่อไปนี้:

NBA Plot

สิ่งที่ฉันต้องการคือป้ายชื่อของผู้เล่นถัดจากจุด ฉันคิดว่าฟังก์ชั่นฉลากในสุนทรียภาพของ ggplot จะทำเพื่อฉัน แต่มันก็ไม่ได้

ฉันยังลองใช้text()ฟังก์ชั่นและtextxy()ฟังก์ชั่นจากlibrary(calibrate)ซึ่งทั้งสองอย่างนั้นไม่สามารถใช้งานกับ ggplot ได้

ฉันจะเพิ่มป้ายชื่อในจุดเหล่านี้ได้อย่างไร

คำตอบ:


280

ใช้geom_textกับaesฉลาก คุณสามารถเล่นกับhjust, vjustเพื่อปรับตำแหน่งข้อความ

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)

แผนภูมิที่มีป้ายกำกับเงื่อนไข


4
มีวิธีใดบ้างที่จะเลื่อนป้ายไปรอบ ๆ (หลบเล็กน้อยเลย) เพื่อไม่ให้ซ้อนทับกัน?
โทมัสบราวน์

2
ผมไม่คิดว่าจะมีวิธีการแก้ปัญหาใด ๆ ggplot2ได้ง่ายภายใน บางทีนี่อาจช่วยคุณได้
agstudy

1
มีวิธีใดที่จะติดป้ายเฉพาะจุดที่สูงกว่าค่าที่แน่นอนตัวอย่างเช่น PTS ที่มากกว่า 24 ในพล็อตด้านบน
ONeillMB1

ขาด 'dodging' อย่างถูกต้องลองพิจารณาสิ่งนี้hjust = -0.1เพื่อให้ได้ฉลากที่พิมพ์ออกมาไกลจากจุดข้อมูลเล็กน้อย
PatrickT

ที่จะเปลี่ยนป้ายรอบพิจารณาggrepel
โฮเมอร์ไวท์

92

ggrepelแพคเกจงานได้ดีสำหรับการขับไล่ป้ายข้อความที่ทับซ้อนกันออกจากกัน คุณสามารถใช้geom_label_repel()(วาดสี่เหลี่ยมรอบข้อความ) หรือ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)

แก้ไข:ในการใช้งานggrepelที่มีเส้นให้ดูนี้และนี้

สร้างเมื่อ 2019-05-01 โดยแพ็คเกจ reprex (v0.2.0)


1
เรียบร้อย! ฉันชอบพล็อตแรกจริงๆ ฉันลองสิ่งนี้กับข้อมูลของฉันและฉันมีความสุขกับผลลัพธ์ยกเว้นว่าคำอธิบายจะแสดง "a" แทนรูปทรงที่แสดงในพล็อต (ฉันใช้รูปทรงสวยงามเพื่อแยกแยะจุดตามปัจจัย)
ผู้ชายผึ้ง

2
ฉันแก้ไขปัญหานี้ได้ในขณะนี้โดย (a) การแยกคำอธิบายของพล็อตที่ไม่มี geom_label_repel stackoverflow.com/questions/12041042/และและ (b) เพิ่มมันด้วย gridExtra :: grid.arrange พล็อตที่มีป้ายกำกับ หากคุณรู้วิธีแก้ปัญหาที่ง่ายกว่านี้ฉันยังคงยินดีอย่างนั้น!
คนที่แต่งตัวประหลาดผึ้ง

1
@beeguy: ไม่แน่ใจว่าผมจะได้รับสิ่งที่คุณขอ แต่ฉันเพิ่งเห็นกระทำในggplot2dev ที่กล่าวถึงสิ่งที่คล้ายกันgithub.com/tidyverse/ggplot2/commit/... คุณสามารถลองติดตั้งรุ่น dev ทั้งสองggplot2และggrepelเพื่อดูว่าปัญหาของคุณได้รับการแก้ไข
ตุง

1
@beeguy: fyi ยังมีlemonแพ็คเกจที่ดีมากในการจัดการกับตำนานพล็อต
ตุง

1
ขอบคุณสำหรับคำแนะนำ
ผู้ชายผึ้ง

10

แทนที่จะใช้ ifelse ดังในตัวอย่างข้างต้นเราสามารถกรองข้อมูลล่วงหน้าก่อนการทำฉลากตามค่าเกณฑ์บางอย่างซึ่งจะช่วยประหยัดงานได้มากสำหรับอุปกรณ์การทำพล็อต:

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))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.