美文网首页作图可视化科研信息学
跟着Nature microbiology学画图~R语言ggpl

跟着Nature microbiology学画图~R语言ggpl

作者: 小明的数据分析笔记本 | 来源:发表于2020-12-27 18:16 被阅读0次

    今天要模仿的图片来自于论文 Core gut microbial communities are maintained by beneficial interactions and strain variability in fish。期刊是 Nature microbiology

    image.png image.png

    之前分享过两篇使用R语言的ggraph包画网络图的推文

    超链接

    但是今天这个论文里的网络图是两个两个圆形的布局,这个用ggraph包如何来实现自己暂时还不知道。

    仔细想了一下,这个网络图就是点和线的组合,使用ggplot2包的geom_point()geom_segment()函数应该可以比较方便的实现。因为是圆形的布局,所以散点的坐标直接用圆形函数来生成就好了。有了想法 下面实现一下。

    首先是构造数据集

    散点的位置坐标用圆形函数来生成,圆心是(0,0)半径是4,总共生成32个点

    a<-90/8
    a
    x1<-c()
    y1<-c()
    for (i in 1:7){
      x1<-append(x1,4*cos(i*a*pi/180))
      y1<-append(y1,4*sin(i*a*pi/180))
    
    }
    x1
    y1
    df1<-data.frame(x=x1,y=y1)
    df2<-data.frame(x=x1,y=-y1)
    df3<-data.frame(x=-x1,y=y1)
    df4<-data.frame(x=-x1,y=-y1)
    df5<-data.frame(x=c(0,4,0,-4),
                    y=c(4,0,-4,0))
    df11<-rbind(df1,df2,df3,df4,df5)
    df11$group<-"A"
    df11$color<-sample(c("A","B"),dim(df11)[1],replace = T)
    
    接下来画一个简单的散点图试一下
    ggplot(df11,aes(x,y))+
      geom_point(aes(shape=color,color=color),size=5)+
      theme(panel.background = element_blank(),
            axis.title = element_blank(),
            axis.text = element_blank(),
            axis.ticks = element_blank())
    
    image.png

    按照这个思路是可以实现今天推文中提到的论文里的网络图的。今天时间有限,下面的代码就不详细介绍了,先记录在这里

    library(dplyr)
    library(ggplot2)
    a<-90/8
    a
    x1<-c()
    y1<-c()
    for (i in 1:7){
      x1<-append(x1,4*cos(i*a*pi/180))
      y1<-append(y1,4*sin(i*a*pi/180))
    
    }
    x1
    y1
    df1<-data.frame(x=x1,y=y1)
    df2<-data.frame(x=x1,y=-y1)
    df3<-data.frame(x=-x1,y=y1)
    df4<-data.frame(x=-x1,y=-y1)
    df5<-data.frame(x=c(0,4,0,-4),
                    y=c(4,0,-4,0))
    df11<-rbind(df1,df2,df3,df4,df5)
    df11$group<-"A"
    df11$color<-sample(c("A","B"),dim(df11)[1],replace = T)
    
    b<-90/2
    b
    x2<-c()
    y2<-c()
    for (i in 1){
      x2<-append(x2,1*cos(i*b*pi/180))
      y2<-append(y2,1*sin(i*b*pi/180))
    }
    x2
    y2
    df6<-data.frame(x=x2+5,y=y2+5)
    df7<-data.frame(x=-x2+5,y=y2+5)
    df8<-data.frame(x=x2+5,y=-y2+5)
    df9<-data.frame(x=-x2+5,y=-y2+5)
    df10<-data.frame(x=c(0,1,0,-1)+5,
                     y=c(1,0,-1,0)+5)
    df22<-rbind(df6,df7,df8,df9,df10)
    df22$group<-"B"
    df22$color<-sample(c("C","D"),dim(df22)[1],replace = T)
    df<-rbind(df11,df22)
    df$lable<-paste("Sample",1:dim(df)[1],sep="_")
    
    
    
    node1<-sample(df$lable,60,replace = T)
    node2<-sample(df$lable,60,replace = T)
    dfnode<-data.frame(node1,node2)
    dfnode
    
    x3<-c()
    y3<-c()
    xend<-c()
    yend<-c()
    for (i in 1:60){
      label1<-dfnode[i,]$node1
      #print(label1)
      label2<-dfnode[i,]$node2
      #print(label2)
      dfnew1<-filter(df,lable==label1)
      #print("OK")
      dfnew2<-filter(df,lable==label2)
      x3<-append(x3,dfnew1$x)
      y3<-append(y3,dfnew1$y)
      xend<-append(xend,dfnew2$x)
      yend<-append(yend,dfnew2$y)
    }
    
    dfedge<-data.frame(x=x3,xend,y=y3,yend)
    dfedge$node1<-node1
    dfedge$node2<-node2
    dfedge$group<-sample(c("A","B","C"),dim(dfedge)[1],replace = T)
    
    ggplot()+
      geom_segment(data=dfedge,aes(x=x,y=y,xend=xend,yend=yend),
                   size=1,color="grey",alpha=0.5)+
      geom_point(data=df,
                 aes(x,y,shape=group,
                     color=group),
                 size=5)+
      theme(panel.background = element_blank(),
            axis.text = element_blank(),
            axis.title = element_blank(),
            axis.ticks = element_blank())
    
    最终的结果是
    image.png

    所以如果有了网络图点和边的数据,自己应该可以用ggplot2来做网络图了。

    欢迎大家关注我的公众号
    小明的数据分析笔记本

    相关文章

      网友评论

        本文标题:跟着Nature microbiology学画图~R语言ggpl

        本文链接:https://www.haomeiwen.com/subject/aigonktx.html