Cara menggabungkan grafik yang dihasilkan dengan igraph dan plot yang dibuat dengan ggplot2 melalui cowplot::plot_grid

Awalnya, saya tidak dapat memplotnya sepenuhnya, artinya saya tidak dapat menemukan cara untuk menangkap objek plot dan memasukkannya ke cowplot::plot_grid. Sekarang, saya menemukan solusi yang menyimpan gambar plot grafik sebagai png dan membacanya dengan cowplot::draw_image. Apakah ada cara yang lebih sederhana untuk melakukannya? Selain itu, sulit untuk mengatur parameter png untuk mendapatkan resolusi dan ukuran yang baik serta menghindari pemangkasan margin. Saya juga memerlukan beberapa penyesuaian pada plotnya, misalnya, self-loop dan panah terarah dengan nilai bobot koneksi yang tepat harus dimungkinkan.

Berikut ini ada dua pilihan dan hasilnya masing-masing saya peroleh.

library(ggplot2); library(cowplot); library(igraph)
graph_1 <- sample_gnm(10, 25, directed = T, loops = T)
gg_test <- ggplot(data.frame("a" = seq(1, 5, length.out = 10), "b" = runif(10)), aes(x=a, y=b)) + geom_point() + theme_classic()

Opsi 1 - langsung

# option 1 - empty graph
cowplot::plot_grid(plot(graph_1), gg_test)

memilih1

Opsi 2 - mengajukan

# option 2 - working but horrible code and difficult setting of the resolution/size (r-base not the best)
png("to_delete_for_import.png", res = 150, height = 800, width = 1100)
plot(graph_1, edge.label = LETTERS[1:10], vertex.color = RColorBrewer::brewer.pal(10, "Spectral"))
dev.off()
graph_1_cwpl <- ggdraw() + draw_image("to_delete_for_import.png")
file.remove("to_delete_for_import.png")
cowplot::plot_grid(graph_1_cwpl, gg_test)

memilih2


person Garini    schedule 16.07.2019    source sumber
comment
Ini tidak benar-benar berfungsi dengan baik, tapi mungkin Anda dapat menemukan cara untuk membuatnya lebih baik: pengguna x <- recordPlot() setelah Anda membuat grafik dan kemudian plot_grid(x, gg_test). Namun, saya khawatir, hasilnya tidak mengesankan. Apakah Anda mencoba ggnet2?   -  person January    schedule 16.07.2019
comment
recordPlot() berfungsi tetapi memerlukan paket gridGraphics dan (dalam kasus saya) menambahkan label NA di tepinya. Tapi dari segi kualitas, itu baik-baik saja! Saya tidak tahu ggnet2 saya takut. Saya akan memeriksanya;)   -  person Garini    schedule 16.07.2019
comment
Ya, NA ditambah gaya simpul dan panah yang kacau, tidak yakin Anda dapat dengan mudah mengatasinya.   -  person January    schedule 16.07.2019
comment
Jika gridGraphics mengacaukan plot Anda, harap ajukan masalah di github. Tujuannya adalah untuk menangkap semua grafik dasar dengan tepat, namun ada beberapa kasus sudut yang masih perlu diperbaiki.   -  person Claus Wilke    schedule 16.07.2019
comment
Saya akan membuka masalahnya. Tampaknya ggnet2 (yang cukup bagus) tidak dapat menangani self-loop yang banyak terdapat di aplikasi saya yang sebenarnya. Berdasarkan manfaatnya, saya membuka terbitan di halaman GitHub.   -  person Garini    schedule 16.07.2019
comment
Masalah dengan NAs baru-baru ini diperbaiki di gridGraphics: github.com/pmur002/gridgraphics/issues/14   -  person Claus Wilke    schedule 17.08.2019


Jawaban (1)


Saya baru-baru ini mengalami masalah yang sama dan menemukan solusi berikut berguna. Pendekatan pertama mirip dengan apa yang sudah dikomentari oleh pengguna @January:

library(ggplotify) 
E(graph_1)$label <- ""
plot_grid(base2grob(~plot(graph_1)),
          gg_test)

masukkan deskripsi gambar di sini

Dan inilah pendekatan kedua menggunakan ggraph:

library(ggraph)
ggtest2 <- ggraph(graph_1) +
          geom_node_point() +
          geom_edge_link() +
          theme_classic()

plot_grid(ggtest2, gg_test)

masukkan deskripsi gambar di sini

person Ben Nutzer    schedule 16.07.2019
comment
Bukan itu yang saya cari karena masih perlu membungkam label secara manual dan saya berharap ada cara lain, juga mengingat banyaknya alat yang ada untuk menggambar jaringan. Selain itu, saya tidak tahu bagaimana perilaku grob dalam kasus grafik yang lebih kompleks. Hal yang sama untuk yang kedua, tapi saya akan melihat apakah saya dapat meningkatkan estetika sampai pada titik yang saya butuhkan. - person Garini; 16.07.2019