Saya bertujuan membangun plot bar dengan panah di ujung bar. Saya pergi geom_segment
dengan arrow
didefinisikan. Saya ingin memetakan satu kolom ke transparansi, tetapi estetika alfa tampaknya tidak berfungsi dengan baik dengan objek panah. Berikut cuplikan kode:
tibble(y = c(10, 20, 30), n = c(300, 100, 200), transparency = c(10, 2, 4)) %>%
ggplot() + geom_segment(aes(x = 0, xend = n, y = y, yend = y, alpha = transparency),
colour = 'red', size = 10, arrow = arrow(length = unit(1.5, 'cm'), type = 'closed')) +
scale_y_continuous(limits = c(5, 35))
Dapat dengan mudah diamati bahwa arrow
objek tidak terlihat baik dengan nilai yang lebih rendah alpha
, menunjukkan kerangkanya alih-alih bentuk polos, transparan. Apakah ada cara untuk mencegahnya?
tibble(y = c(10, 20, 30), n = c(300, 100, 200), transparency = c(10, 2, 4)) %>% ggplot() + geom_segment(aes(x = 0, xend = n-10, y = y, yend = y, alpha = transparency), colour = 'red', size = 10) + geom_segment(aes(x = n-0.1, xend = n, y = y, yend = y, alpha = transparency), colour = 'red', size = 1, arrow = arrow(length = unit(1.5, 'cm'), type = 'closed')) + scale_y_continuous(limits = c(5, 35))
Jawaban:
Kita dapat membuat geom baru
geom_arrowbar
,, yang dapat kita gunakan seperti geom lainnya, jadi dalam kasus Anda itu akan memberikan plot yang diinginkan dengan hanya melakukan:Dan berisi 3 parameter,
column_width
,head_width
danhead_length
yang memungkinkan Anda untuk mengubah bentuk panah jika Anda tidak menyukai default. Kami juga dapat menentukan warna isi dan estetika lainnya sesuai kebutuhan:Satu-satunya hambatan adalah kita harus menulisnya terlebih dahulu!
Dengan mengikuti contoh-contoh dalam sketsa ggplot2 yang diperluas , kita dapat mendefinisikan kita
geom_arrowbar
dengan cara yang sama seperti geom lain yang didefinisikan, kecuali kita ingin dapat mengirimkan 3 parameter kita yang mengontrol bentuk panah. Ini ditambahkan keparams
daftarlayer
objek yang dihasilkan , yang akan digunakan untuk membuat layer panah kami:Sekarang "semua" yang tersisa adalah mendefinisikan apa
GeomArrowBar
itu. Ini adalahggproto
definisi kelas yang efektif . Bagian terpenting darinya adalahdraw_panel
fungsi anggota, yang mengambil setiap baris dataframe kami dan mengubahnya menjadi bentuk panah. Setelah beberapa matematika dasar untuk dikerjakan dari koordinat x dan y serta berbagai parameter bentuk kami seperti apa bentuk panah itu, ia menghasilkan satugrid::polygonGrob
untuk setiap baris data kami dan menyimpannya dalam agTree
. Ini membentuk komponen grafis dari layer.Implementasi ini jauh dari sempurna. Ini kehilangan beberapa fungsi penting, seperti batas sumbu default yang masuk akal dan kemampuan untuk
coord_flip
, dan itu akan menghasilkan hasil yang tidak estetika jika kepala panah lebih panjang dari seluruh kolom (meskipun Anda mungkin tidak ingin menggunakan plot seperti itu dalam situasi itu) . Namun, akan ada panah yang menunjuk ke kiri jika Anda memiliki nilai negatif. Implementasi yang lebih baik mungkin juga menambahkan opsi untuk kepala panah kosong.Singkatnya, perlu banyak penyesuaian untuk mengatasi bug (dan lainnya) ini dan membuatnya siap-produksi, tetapi cukup bagus untuk menghasilkan beberapa grafik yang bagus tanpa terlalu banyak upaya untuk sementara waktu.
Dibuat pada 2020-03-08 oleh paket reprex (v0.3.0)
sumber
Anda dapat menggunakan
geom_gene_arrow
darilibrary(gggenes)
sumber