Bipartite network graph with ggplot2

前端 未结 1 853
南旧
南旧 2021-02-06 04:51

I have the following data frame:

structure(list(X1 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L,         


        
1条回答
  •  你的背包
    2021-02-06 05:25

    A simple ggplot2 version of your graph is possible by using geom_segment() and transforming the data much like you did for the base graphics version. I've also included an arguably more polished version, using some of the more advanced customization options in ggplot2.

    # Using ggplot2 version 0.9.2.1
    library(ggplot2)
    
    dat$x1_norm = rangeTransform(as.integer(dat$X1))
    dat$x2_norm = rangeTransform(as.integer(dat$X2))
    
    dat$y1 = 0
    dat$y2 = 1
    
    # Simple version.
    p1 = ggplot(dat, aes(x=x1_norm, xend=x2_norm, y=y1, yend=y2, colour=X1)) +
         geom_segment(size=1.2) +
         scale_colour_brewer(palette="Set1", name="Person")
    
    ggsave(plot=p1, filename="plot_1.png", height=3.5, width=6)
    

    enter image description here

    # Fancy version.
    # Create separate data.frames to manually specify axis ticks and axis text.
    axis_1 = data.frame(x=rangeTransform(as.integer(unique(dat$X1))),
                        y=0, label=as.character(unique(dat$X1)))
    
    axis_2 = data.frame(x=rangeTransform(as.integer(unique(dat$X2))),
                        y=1, label=as.character(unique(dat$X2)))
    
    p2 = ggplot(data=dat) +
         theme_bw() +
         theme(axis.title=element_blank()) +
         theme(axis.text=element_blank()) +
         theme(axis.ticks=element_blank()) +
         theme(panel.grid=element_blank()) +
         geom_segment(aes(x=x1_norm, xend=x2_norm, y=y1, yend=y2, colour=X1),
                      size=1.2) +
         geom_segment(x=0, xend=1, y=0, yend=0, size=0.7) +
         geom_segment(x=0, xend=1, y=1, yend=1, size=0.7) +
         scale_colour_brewer(palette="Set1", name="Person") +
         scale_y_continuous(limits=c(-0.2, 1.2), expand=c(0, 0)) +
         geom_segment(data=axis_1, aes(x=x, xend=x, y=y, yend=y-0.025), size=0.7) +
         geom_segment(data=axis_2, aes(x=x, xend=x, y=y, yend=y+0.025), size=0.7) +
         geom_text(data=axis_1, aes(label=label, x=x, y=y - 0.075)) +
         geom_text(data=axis_2, aes(label=label, x=x, y=y + 0.075))
    
    ggsave(plot=p2, filename="plot_2.png", height=3.5, width=6)
    

    enter image description here

    0 讨论(0)
提交回复
热议问题