Bagaimana cara menambahkan geom_text atau geom_label dengan posisi relatif terhadap ukuran geom_point?

Jan 20 2021

Apa yang saya coba lakukan, adalah menambahkan label ke poin yang dibuat dengan geom_point yang memiliki variabel yang dipetakan ke ukurannya. Nilainya juga ditampilkan di label. Teks atau label harus diposisikan tepat di bawah geom_point, tetapi mencapai ini dengan position_nudge tampaknya tidak mungkin.

Kode saya saat ini terlihat seperti ini (disederhanakan):

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

Hasilnya begini

tetapi saya mencoba mencapai sesuatu seperti ini:

Adakah cara untuk mencapai ini dengan cara yang sederhana?

Terima kasih.

EDIT: Saya mencoba agar jarak antara batas geom_point dan batas label menjadi nilai tetap.

Jawaban

1 tjebo Jan 21 2021 at 06:09

Saya harap ini cukup berbeda untuk mendapatkan jawaban lain. Saya akui saya telah mengabaikan sedikit tentang apa sebenarnya yang Anda inginkan untuk memposisikan label. Jadi pada dasarnya Anda menginginkannya tidak relatif terhadap pusat titik, tetapi jari-jarinya.

Saya merasa sangat bernostalgia dengan pertanyaan pertama saya di komunitas ini , yang saya akui saya belum memahami jawabannya untuk waktu yang lama.

Ide dasarnya adalah tidak menggunakan geom_point , tetapi menggunakan ggforce :: geom_circle (atau: geom_ellipse). Anda dapat menggunakan radius yang Anda gunakan untuk pembuatan untuk memposisikan label Anda. Ini membutuhkan sedikit pengkodean keras, tetapi saya yakin akan ada cara untuk menentukan radius secara terprogram berdasarkan koordinat umum Anda.

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

Dibuat pada 2021-2020 oleh paket reprex (v0.3.0)

2 RuiBarradas Jan 20 2021 at 23:11

Masalahnya bisa diselesaikan dengan menskalakan sizedan menambahkannya ke vjustjarak ke poin.

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

Uji data

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

Menggunakan nudge

Terima kasih kepada Rui untuk datanya. +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 )

Dibuat pada 2021-2020 oleh paket reprex (v0.3.0)