当前位置: 首页>后端>正文

跟着Nature microbiology学画图~R语言ggplot2画网络图的一个简单小例子

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

跟着Nature microbiology学画图~R语言ggplot2画网络图的一个简单小例子,第1张
跟着Nature microbiology学画图~R语言ggplot2画网络图的一个简单小例子,第2张

之前分享过两篇使用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())
跟着Nature microbiology学画图~R语言ggplot2画网络图的一个简单小例子,第3张

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

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())
最终的结果是
跟着Nature microbiology学画图~R语言ggplot2画网络图的一个简单小例子,第4张

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

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


https://www.xamrdz.com/backend/3pb1923372.html

相关文章: