Bagaimana saya bisa mendapatkan koordinat x , y dari geom_point dalam ggplot , di mana kerangka referensi adalah seluruh gambar yang diplot?
Saya dapat membuat ggplot dengan beberapa geom_point menggunakan:
library(ggplot2)
my.plot <- ggplot(data.frame(x = c(0, 0.456, 1), y = c(0, 0.123, 1))) +
geom_point(aes(x, y), color = "red")
Ini memberi:
Dengan mengonversinya menjadi grob , saya dapat mengekstrak beberapa informasi tambahan tentang ggplot ini , seperti koordinat yang berkaitan dengan panel plot, yang ditandai oleh panah ungu. Namun, ini mengabaikan ruang yang diambil oleh sumbu.
my.grob <- ggplotGrob(my.plot)
my.grob$grobs[[6]]$children[[3]]$x
# [1] 0.0454545454545455native 0.46native 0.954545454545454native
my.grob$grobs[[6]]$children[[3]]$y
# [1] 0.0454545454545455native 0.157272727272727native 0.954545454545454native
Bagaimana saya bisa mendapatkan nilai koordinat x , y ketika saya mulai mengukur dari sudut kiri bawah seluruh gambar, yang ditandai oleh panah hijau?
Jika mungkin, saya ingin solusi untuk memperhitungkan tema dari ggplot . Menambahkan tema seperti + theme_void()
memengaruhi sumbu dan juga menggeser lokasi titik sehubungan dengan keseluruhan gambar yang diplot.
Pembaruan : Saya menyadari bahwa ukuran font sumbu berubah tergantung pada lebar dan tinggi plot, memengaruhi ukuran relatif panel plot . Jadi tidak akan sepele untuk menyediakan lokasi dalam satuan npc tanpa menentukan lebar plot dan tinggi plot . Jika memungkinkan, berikan lokasi geom_points sebagai fungsi dari lebar plot dan tinggi plot .
Jawaban:
Ketika Anda mengubah ukuran ggplot, posisi elemen dalam panel tidak pada posisi tetap di ruang NPC. Ini karena beberapa komponen plot memiliki ukuran tetap, dan beberapa di antaranya (misalnya, panel) mengubah dimensi sesuai dengan ukuran perangkat.
Ini berarti bahwa solusi apa pun harus memperhitungkan ukuran perangkat, dan jika Anda ingin mengubah ukuran plot, Anda harus menjalankan perhitungan lagi. Karena itu, untuk sebagian besar aplikasi (termasuk aplikasi Anda, dari berbagai hal), ini bukan masalah.
Kesulitan lain adalah memastikan Anda mengidentifikasi grob yang benar di dalam panel grob, dan sulit untuk melihat bagaimana ini dapat dengan mudah digeneralisasikan. Menggunakan fungsi subset daftar
[[6]]
dan[[3]]
dalam contoh Anda tidak dapat digeneralisasi ke plot lain.Bagaimanapun, solusi ini bekerja dengan mengukur ukuran dan posisi panel di dalam gtable, dan mengubah semua ukuran menjadi milimetre sebelum membaginya dengan dimensi plot dalam milimetre untuk dikonversi ke ruang NPC. Saya telah mencoba membuatnya sedikit lebih umum dengan mengekstraksi panel dan poin dengan nama daripada indeks numerik.
Sekarang kita dapat mengujinya dengan contoh Anda:
Dan kami dapat mengonfirmasi bahwa nilai-nilai ini benar dengan memplot beberapa poin grob di atas poin merah Anda, menggunakan nilai kami sebagai koordinator NPC:
Dibuat pada 2020-03-25 oleh paket reprex (v0.3.0)
sumber
sum(to_mm(gt$heights[seq(panel_pos$t - 1)]))
Bagian ini adalah yang paling aneh. Bisakah Anda menjelaskan apa yang Anda simpulkan di sini?panel_pos$t
memberikan baris kisi di mana panel (fleksibel) duduk, demikianseq(panel_pos$t -1)
juga semua nomor baris di atas ini, dan oleh karena itusum(to_mm(gt$heights[seq(panel_pos$t - 1)]))
adalah jumlah dari ketinggian baris ini.