Làm cách nào để thêm geom_text hoặc geom_label với vị trí liên quan đến kích thước của geom_point?

Jan 20 2021

Những gì tôi đang cố gắng làm, là thêm nhãn cho các điểm được tạo bằng geom_point có một biến được ánh xạ theo kích thước. Giá trị cũng được hiển thị trong nhãn. Văn bản hoặc nhãn phải được định vị ngay dưới geom_point, nhưng việc đạt được điều này với position_nudge dường như không khả thi.

Mã của tôi hiện trông như thế này (đơn giản hóa):

ggplot(data, aes(x = var1, y = var2) +
   geom_point(aes(size = var3)) +
   geom_text(aes(label = var3))

Kết quả là cái này

nhưng tôi đang cố gắng đạt được điều gì đó như thế này:

Có cách nào để đạt được điều này một cách đơn giản?

Cảm ơn.

CHỈNH SỬA: Tôi đang cố để khoảng cách giữa đường viền của geom_point và đường viền của các nhãn là một giá trị cố định.

Trả lời

1 tjebo Jan 21 2021 at 06:09

Tôi hy vọng điều này đủ khác biệt để xứng đáng với một câu trả lời khác. Tôi thừa nhận rằng tôi đã bỏ qua một chút chính xác những gì bạn muốn định vị các nhãn. Vì vậy, về cơ bản bạn muốn nó không liên quan đến tâm điểm mà là bán kính.

Tôi cảm thấy rất nhớ về câu hỏi đầu tiên của chính mình trong cộng đồng này , mà tôi thừa nhận rằng tôi đã không hiểu câu trả lời của nó trong một thời gian dài.

Ý tưởng cơ bản là không sử dụng geom_point mà sử dụng ggforce :: geom_circle (hoặc: geom_ellipse). Bạn có thể sử dụng bán kính mà bạn sử dụng để tạo để định vị các nhãn của mình. Nó yêu cầu một chút mã hóa khó, nhưng tôi chắc chắn sẽ có nhiều cách để xác định bán kính theo chương trình dựa trên tọa độ chung của bạn.

library(ggplot2)
library(ggforce)

foo <- data.frame(var1 = rep(1:3, 2),  var2 =rep(1:2, each = 3),
                   var3 = c(3, 10, 2, 1, 1, 10))
# Create cuts - you can also assign other values of course. factor of 0.01 was chosen randomly. 
foo$rad <- 0.01 * findInterval(foo$var3, 1:5)

ggplot(foo) +
  geom_circle(aes(x0 = var1, y0 = var2, r = rad),
              fill = "Grey50") +
  geom_text(aes(x = var1, y = var2 - rad - 0.03, label = var3)) +
  coord_equal()

Được tạo vào 2021-01-20 bởi gói reprex (v0.3.0)

2 RuiBarradas Jan 20 2021 at 23:11

Vấn đề có thể được giải quyết bằng cách chia tỷ lệ sizevà thêm nó vào vjustkhoảng cách đến các điểm.

library(ggplot2)

ggplot(data, aes(x = var1, y = var2)) +
  geom_point(aes(size = var3), show.legend = FALSE) +
  geom_text(aes(label = var3, vjust = 1.5 + 0.1 * var3))

Dữ liệu thử nghiệm

data <- data.frame(var1 = factor(rep(1:3, 2)),
                   var2 = factor(rep(1:2, each = 3)),
                   var3 = c(3, 10, 2, 1, 1, 10))
2 tjebo Jan 21 2021 at 00:08

Sử dụng nudge

Cảm ơn Rui về dữ liệu. +1

library(ggplot2)
data <- data.frame(var1 = factor(rep(1:3, 2)),
                   var2 = factor(rep(1:2, each = 3)),
                   var3 = c(3, 10, 2, 1, 1, 10))

ggplot(data, aes(x = var1, y = var2)) +
  geom_point(aes(size = var3), show.legend = FALSE) +
  geom_text(aes(label = var3), nudge_y = -0.1 )

Được tạo vào 2021-01-20 bởi gói reprex (v0.3.0)