网络可视化R包-geomnet

2022-03-28 15:39:16 浏览数 (3)

geomnet是一个基于ggplot2可视化图形和网络的R包,它使用sna包计算网络布局,并且包含了使用ggplot2绘制圆的geom_circle函数。

一、geomnet绘图

代码语言:javascript复制
install.packages('geomnet')
library(dplyr)
library(geomnet)
data(theme_elements)
#theme_elements 分为两组子集,分别edges和vertices,edges中包含child和parent这两列

#数据整理:
TEnet <- fortify(as.edgedf(theme_elements$edges[,c("parent", "child")]),
                 theme_elements$vertices)
#as.edgedf:将数据映射到edgedf
#fortify:将网路边的数据转换为geomnet使用的格式
代码语言:javascript复制
#计算节点的度:
TEnet <- TEnet %>% group_by(from_id) %>%   
        mutate(degree = sqrt(10 * n()   1))
#%>%是dplyr包中的管道函数,把左件的值发送给右件,并作为右件表达式函数的第一个参数
#mutate函数是添加新的列,将新增变量放在数据集的最后面

1. 例一

代码语言:javascript复制
ggplot(data = TEnet,
       aes(from_id = from_id, to_id = to_id))  
geom_net(layout.alg = "fruchtermanreingold",
         #layout.alg是布局使用的算法,有"kamadakawai","fruchtermanreingold","circle",
         aes(fontsize = degree), directed = TRUE,
         #根据节点度调整节点字的大小
         #边有方向
         labelon = TRUE, size = 1, labelcolour = 'black',
         #labelon给节点添加标签,调整大小和颜色
         ecolour = "grey70", arrowsize = 0.5,
         #ecolour是边的颜色
         #arrowsize调整箭头大小
         linewidth =0.5, repel = TRUE
         #linewidth是边的宽度
         #repel如果为TRUE,则使用ggrepel包geoms而不是ggplot2 geoms绘制节点标签。
         )  
  theme_net()  
  xlim(c(-0.05, 1.05))  
  ggtitle("layout.alg = fruchtermanreingold")   
   #加标题
  theme(plot.title = element_text(lineheight=1, face="bold",hjust = 0.5)) 
   #调整标题

2. 例二

代码语言:javascript复制
library(geomnet)
data(blood)
ggplot(data = blood$edges, aes(from_id = from, to_id = to))  
  geom_net(colour = "darkred", layout.alg = "circle", labelon = TRUE,
           size = 15, directed = TRUE, vjust = 0.5, labelcolour = "grey80",
           arrowsize = 1.5, linewidth = 0.5, arrowgap = 0.05,
           #arrowgap 箭头到节点的距离
           selfloops = TRUE, ecolour = "grey40")  
           #selfloops,是否显示循环,若是,则在相应节点附近画一个圆,默认为FALSE
           theme_net()

3. 例三

http://www.stats.ox.ac.uk/~snijders/siena/siena_datasets.htm

获取示例数据

代码语言:javascript复制
library(geomnet)
head(hp.edges)
代码语言:javascript复制
head(football$vertices)
代码语言:javascript复制
hp.all <- fortify(as.edgedf(hp.edges), hp.chars, group = "book")
#使用name1作为from节点列,使用name2作为to节点列。
#如果这是不正确的,则重写dat,以使前两列分别为from和to节点。
#分别通过from_id和name连接边缘和节点信息。
#仅绘制给定书中具有任何连接的字符。

ggplot(data=hp.all, aes(from_id = from, to_id = to_id))  
  geom_net(fiteach=T, directed = T, size = 3, linewidth =0.5,
#网络图是否分别安装在每个面板中
           ealpha =0 .5, labelon = T, fontsize = 3, repel = T,
           labelcolour = "black", arrowsize = .5, singletons = FALSE,
#没有其他联系(度为0)的节点是否绘制,默认为TRUE
           aes(colour = house, group = house, shape = gender))  
# 根据house分颜色,house分组,gender分形状
  scale_colour_manual(values = c("#941B08","#F1F31C",
                                 "#071A80", "#154C07"))  
  facet_wrap(~book, labeller = "label_both")    
  theme_net()  
  theme(panel.background = element_rect(colour = 'black'))

二、与ggplotly包共用

plotly是交互式绘图展示方法

1. 例一

绘制后,将鼠标放置在图中的节点或者边上,会提示节点/边的详细信息

代码语言:javascript复制
library(geomnet)
library(plotly)

data(blood)  
#blood是geomnet自带数据
bloodnet <- fortify(as.edgedf(blood$edges), blood$vertices)

p <- ggplot(data = bloodnet, aes(from_id = from_id, to_id = to_id))
p2 <- p   geom_net(aes(size=Predominance, colour=type, shape=rho, linetype=group_to),
                   linewidth=0.75, labelon =TRUE, directed = TRUE, labelcolour="black")  
  facet_wrap(~Ethnicity)    
  #分面
  scale_colour_brewer(palette="Set2")  
  #主题颜色
  ggplotly(p2)

2. 例二

绘制后,将鼠标放置在图中的节点或者边上,会提示节点/边的详细信息。右上方是工具栏。

代码语言:javascript复制
data(football)  #football是geomnet自带数据
ftnet <- fortify(as.edgedf(football$edges), football$vertices)  
#合并数据
gg <- ggplot(data = ftnet,aes(from_id = from_id, to_id = to_id))  
    geom_net(layout.alg = 'fruchtermanreingold',
             aes(colour = value, group = value,
             linetype = factor(same.conf != 1)),
           linewidth = 0.5,
           size = 5, vjust = -0.75, alpha = 0.3)  
#alpha是节点的Alpha透明混合处理,取值范围0至1
  theme_net()   
   #移除背景
  theme(legend.position = "bottom")    
   #图例位置
  scale_colour_brewer("Conference", palette = "Paired")     
  #分组赋值颜色
  guides(linetype = FALSE)  
  #guides,是否移除图例
ggplotly(gg)

小编总结:

除了Cytoscape软件以外,我们也可使用geomnet包来绘制网络图,而且这种交互式展示方法可用于数据库的设计中,美观且功能性强,大家可以借鉴哦!

1 人点赞