จะเพิ่ม geom_text หรือ geom_label ด้วยตำแหน่งที่สัมพันธ์กับขนาดของ geom_point ได้อย่างไร

Jan 20 2021

สิ่งที่ฉันพยายามทำคือเพิ่มป้ายกำกับให้กับจุดที่สร้างด้วย geom_point ที่มีตัวแปรที่แมปกับขนาด ค่านี้จะแสดงในฉลากด้วย ข้อความหรือป้ายกำกับควรอยู่ในตำแหน่งที่อยู่ใต้ geom_point แต่ดูเหมือนจะไม่สามารถทำได้ด้วย position_nudge

ขณะนี้รหัสของฉันมีลักษณะดังนี้ (แบบง่าย):

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

ผลลัพธ์ก็คือสิ่งนี้

แต่ฉันพยายามที่จะบรรลุสิ่งนี้:

มีวิธีใดบ้างที่จะบรรลุสิ่งนี้ด้วยวิธีง่ายๆ?

ขอบคุณ.

แก้ไข: ฉันพยายามกำหนดให้ระยะห่างระหว่างเส้นขอบของ geom_point และเส้นขอบของป้ายกำกับเป็นค่าคงที่

คำตอบ

1 tjebo Jan 21 2021 at 06:09

ฉันหวังว่านี่จะแตกต่างกันพอสมควรกับคำตอบอื่น ๆ ฉันยอมรับว่าฉันมองข้ามไปเล็กน้อยว่าคุณต้องการวางตำแหน่งป้ายกำกับอะไรกันแน่ โดยพื้นฐานแล้วคุณไม่ต้องการให้มันสัมพันธ์กับจุดศูนย์กลาง แต่เป็นรัศมี

ฉันรู้สึกคิดถึงคำถามแรกของตัวเองในชุมชนนี้ซึ่งฉันยอมรับว่าฉันไม่เข้าใจคำตอบมานานมากแล้ว

แนวคิดพื้นฐานคือห้ามใช้ geom_pointแต่ให้ใช้ ggforce :: geom_circle (หรือ: geom_ellipse) คุณสามารถใช้รัศมีที่คุณใช้ในการสร้างเพื่อวางตำแหน่งป้ายกำกับของคุณ ต้องใช้การเข้ารหัสค่อนข้างยาก แต่ฉันแน่ใจว่าจะมีวิธีกำหนดรัศมีโดยใช้โปรแกรมตามพิกัดทั่วไปของคุณ

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

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

2 RuiBarradas Jan 20 2021 at 23:11

ปัญหาสามารถแก้ไขได้โดยการปรับขนาดsizeและเพิ่มvjustระยะทางไปยังจุด

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

ข้อมูลการทดสอบ

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

ใช้ nudge

ขอบคุณ Rui สำหรับข้อมูล +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 )

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