Điểm nhãn trong geom_point


178

Dữ liệu tôi đang chơi đến từ nguồn internet được liệt kê bên dưới

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

Những gì tôi muốn làm là tạo một biểu đồ điểm 2D so sánh hai số liệu từ bảng này, với mỗi người chơi đại diện cho một dấu chấm trên biểu đồ. Tôi có đoạn mã sau:

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

Điều này cho tôi như sau:

Lô đất NBA

Những gì tôi muốn là một nhãn của tên người chơi ngay bên cạnh các dấu chấm. Tôi nghĩ rằng chức năng nhãn trong thẩm mỹ của ggplot sẽ làm điều này cho tôi, nhưng nó đã không làm được.

Tôi cũng đã thử text()chức năng và textxy()chức năng từ library(calibrate), cả hai đều không hoạt động với ggplot.

Làm thế nào tôi có thể thêm nhãn tên cho những điểm này?

Câu trả lời:


280

Sử dụng geom_text, với aesnhãn hiệu. Bạn có thể chơi với hjust, vjustđể điều chỉnh vị trí văn bản.

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

nhập mô tả hình ảnh ở đây

EDIT: Chỉ dán nhãn các giá trị trên một ngưỡng nhất định:

  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)

biểu đồ với nhãn điều kiện


4
Có cách nào để thay đổi nhãn xung quanh (tránh chúng quá nhẹ) để chúng không bị trùng nhau không?
Thomas Browne

2
Tôi không nghĩ có bất kỳ giải pháp dễ dàng nào trong đó ggplot2. Có lẽ điều này có thể giúp bạn.
agstudy

1
Có cách nào để chỉ gắn nhãn các điểm trên một giá trị nhất định, ví dụ PTS lớn hơn 24 trên lô trên không?
ONeillMB1

thiếu 'né tránh' đúng cách, hãy xem xét điều này hjust = -0.1để có được các nhãn in cách xa điểm dữ liệu một chút.
Patrick 3/03/2016

Để thay đổi nhãn xung quanh, hãy xem xét ggrepel .
Homer White

92

Các ggrepelgói hoạt động tuyệt vời để xua đuổi chồng chéo nhãn văn bản ra xa nhau. Bạn có thể sử dụng geom_label_repel()(vẽ hình chữ nhật xung quanh văn bản) hoặc các geom_text_repel()hàm.

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

nhập mô tả hình ảnh ở đây

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

Chỉnh sửa: Để sử dụng ggrepelvới các dòng, xem cái nàycái này .

Được tạo vào ngày 2019-05-01 bởi gói reprex (v0.2.0).


1
Khéo léo! Tôi thực sự thích cốt truyện đầu tiên. Tôi đã thử điều này với dữ liệu của mình và tôi hài lòng với kết quả ngoại trừ việc truyền thuyết hiển thị "a" thay vì các hình được hiển thị trong cốt truyện. (Tôi sử dụng hình dạng thẩm mỹ để phân biệt các điểm theo một yếu tố)
anh chàng ong

2
Bây giờ tôi đã giải quyết vấn đề này bằng cách (a) trích xuất huyền thoại của một âm mưu mà không có geom_label_Vpel stackoverflow.com/questions/12041042/ và và sau đó thêm nó vào với GridExtra :: Grid.arrange vào một âm mưu với các nhãn. Nếu bạn biết một giải pháp đơn giản hơn, tôi vẫn sẽ đánh giá cao điều đó!
anh chàng ong

1
@beeguy: không chắc chắn tôi có nhận được những gì bạn đang hỏi nhưng gần đây tôi đã thấy một cam kết về nhà ggplot2phát triển đã đề cập đến điều tương tự github.com/tidyverse/ggplot2/commit/ Lỗi . Bạn có thể thử cài đặt cả hai phiên bản dev của ggplot2& ggrepelđể xem sự cố của bạn đã được khắc phục chưa
Tung

1
@beeguy: fyi cũng có lemongói rất tốt trong việc điều khiển huyền thoại cốt truyện.
Tung

1
Cảm ơn bạn vì tiền boa
chàng ong

10

Thay vì sử dụng ifelse như trong ví dụ trên, người ta cũng có thể lọc trước dữ liệu trước khi dán nhãn dựa trên một số giá trị ngưỡng, điều này giúp tiết kiệm rất nhiều công việc cho thiết bị vẽ:

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))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.