วิธีรวมกราฟที่สร้างด้วย igraph และพล็อตที่สร้างด้วย ggplot2 โดยใช้ cowplot::plot_grid

ในตอนแรก ฉันไม่สามารถพล็อตมันได้ทั้งหมด ซึ่งหมายความว่าฉันไม่สามารถหาวิธีจับวัตถุพล็อตและป้อนไปที่ cowplot::plot_grid ได้ ตอนนี้ ฉันพบวิธีแก้ไขปัญหาชั่วคราวซึ่งบันทึกเพื่อจัดไฟล์รูปภาพของกราฟพล็อตเป็น PNG และอ่านด้วย cowplot::draw_image มีวิธีที่ง่ายกว่านี้ไหม? นอกจากนี้ เป็นการยากที่จะตั้งค่าพารามิเตอร์ของ PNG เพื่อให้มีความละเอียดและขนาดที่ดีและหลีกเลี่ยงการตัดขอบ ฉันยังต้องปรับแต่งโครงเรื่องด้วย เช่น ลูกศรแบบวนซ้ำและแบบกำหนดทิศทางพร้อมค่าน้ำหนักการเชื่อมต่อที่แม่นยำควรเป็นไปได้

ต่อไปนี้ มีสองตัวเลือกและผลลัพธ์ตามลำดับที่ฉันได้รับ

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

ตัวเลือก 1 - โดยตรง

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

opt1

ตัวเลือกที่ 2 - เพื่อยื่น

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

opt2


person Garini    schedule 16.07.2019    source แหล่งที่มา
comment
สิ่งนี้ไม่ได้ผลดีนัก แต่บางทีคุณอาจพบวิธีทำให้ดีขึ้นได้: ผู้ใช้ x <- recordPlot() หลังจากที่คุณสร้างกราฟแล้วตามด้วย plot_grid(x, gg_test) แต่ผลออกมาไม่น่าประทับใจเท่าไหร่ผมเกรงว่า คุณลอง ggnet2 แล้วหรือยัง?   -  person January    schedule 16.07.2019
comment
recordPlot() ใช้งานได้ แต่ต้องมี gridGraphics แพ็คเกจ และ (ในกรณีของฉัน) กำลังเพิ่ม NA ป้ายกำกับที่ขอบ ในด้านคุณภาพก็ยังดี! ฉันไม่รู้ ggnet2 ฉันกลัว ฉันจะตรวจสอบมันออกมา ;)   -  person Garini    schedule 16.07.2019
comment
ใช่ NAs รวมถึงโหนดและรูปแบบลูกศรที่ยุ่งเหยิง ไม่แน่ใจว่าคุณจะสามารถจัดการกับสิ่งนั้นได้อย่างง่ายดาย   -  person January    schedule 16.07.2019
comment
หาก gridGraphics ทำให้พล็อตของคุณยุ่งเหยิง โปรดแจ้งปัญหาบน GitHub เป้าหมายคือการจับภาพกราฟิกพื้นฐานทั้งหมดอย่างสมจริง แต่มีบางกรณีมุมที่ยังต้องได้รับการแก้ไข   -  person Claus Wilke    schedule 16.07.2019
comment
ฉันจะเปิดประเด็น ดูเหมือนว่า ggnet2 (ซึ่งค่อนข้างดี) ไม่สามารถจัดการกับ self-loops ที่มีอยู่ในแอปพลิเคชันจริงของฉันได้ โดยข้อดี ฉันเปิดประเด็นในหน้า GitHub   -  person Garini    schedule 16.07.2019
comment
ปัญหาเกี่ยวกับ NAs ได้รับการแก้ไขเมื่อเร็ว ๆ นี้ใน gridGraphics: github.com/pmur002/gridgraphics/issues/14< /ก>   -  person Claus Wilke    schedule 17.08.2019


คำตอบ (1)


ฉันเพิ่งประสบปัญหาเดียวกันและพบว่าวิธีแก้ไขต่อไปนี้มีประโยชน์ แนวทางแรกคล้ายกับสิ่งที่ผู้ใช้ @January แสดงความคิดเห็นแล้ว:

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

ป้อนคำอธิบายรูปภาพที่นี่

และนี่คือแนวทางที่สองโดยใช้ ggraph:

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

plot_grid(ggtest2, gg_test)

ป้อนคำอธิบายรูปภาพที่นี่

person Ben Nutzer    schedule 16.07.2019
comment
ไม่ใช่สิ่งที่ฉันกำลังมองหาเนื่องจากยังต้องปิดป้ายกำกับด้วยตนเอง และฉันหวังว่าจะมีวิธีอื่น รวมถึงพิจารณาจำนวนเครื่องมือสำหรับการวาดเครือข่ายด้วย นอกจากนี้ฉันไม่รู้ว่าคนร้ายจะมีพฤติกรรมอย่างไรในกรณีของกราฟที่ซับซ้อนกว่านี้ เช่นเดียวกับอันที่สอง แต่ฉันจะดูว่าฉันสามารถปรับปรุงความสวยงามของมันจนถึงจุดที่ฉันต้องการได้หรือไม่ - person Garini; 16.07.2019