网络关系图是由多个节点构成的一种网络结构图。节点通常是指个人或组织,线条通常代表各种社会关系。
在传染病的应用上,网络关系图用于表示传播链,除了可以描绘社会网络外,还可以描述疾病传播网络,更好地理解疾病在某一地区或某一人群中的流行状况。2020年4月9日至4月16日哈尔滨明确了45例病例的传播关系,《南方都市报》绘制了明确的传播关系图(图1)。
图1 哈尔滨本土病例疫情传播链条(4月9日-16日)
该图关系链条明确,但静态图片展示的篇幅较大,可展示的信息也受到限制。因此我们可以利用R语言将其绘制为交互式传播链。
图2 哈尔滨本土病例疫情交互式传播链
阅读原文,前往 交互网页)
下面,我们将介绍制作交互式传播链的过程:
1.数据准备
01
查看数据
我们根据图1,将关系整理为2个数据表格:节点数据(nodes)和关系数据(edges)。
节点数据(nodes)记录每一个病例的基本信息,数据结构如表1所示。表格有4列数据, id表示病例编号,names表示病例姓名,character表示性别与年龄,classification表示病例分类。在我们平时绘制传播链时,至少需要id和name两列数据。
表1 节点数据库结构(nodes)
关系数据(edges)记录病例之间的传播关系,数据结构如表2所示。有5列数据,from列和to列代表了关系两端的两个case或place的编号id(必须与表1的id相对应)。注意疾病传播关系是一种有向关系,所以arrows变量表示关系,可以选择的共有"to", "from", "middle", "middle;to"四种(图3)。第三列“color”代表连接两端网络的颜色,可以根据自己的需要或喜好设置不同的颜色。edges表中的label会在的箭头附近对两端关系做出标注。我们平时绘制 传播链时,至少需要from和to两列数据。
表2 关系数据库结构 (edges)
图3 四种关系示例
02
软件包
我们用到的是 R 环境下的网络交互可视化工具——visNetwork(https://datastorm-open.github.io/visNetwork/)。visNetwork 基于 Java 可视化工具库vis.js开发,为 R 用户提供了简单易用的界面,功能十分强大。
2.绘制交互式网络关系图
0 1
读入数据
首先我们读取整理的2个数据库。代码如下:
library(visNetwork) #加载安装包
library(openxlsx) #加载excel读取包
#读取数据
nodes <- read.xlsx( "nodes.xlsx",sheet = 1)
edges <- read.xlsx( "edges.xlsx",sheet = 1)
02
定义节点属性
接下来我们要在节点上生成一些属性,这样我们把鼠标挪到某个节点上的时候,就会显示该节点的信息。我们分别对 nodes$title 和 nodes$label 赋值。由于我们这里节点较多,显示会比较密集,我们将节点边界的宽度(nodes$borderwidth)设置为2(默认值为1),这样他们看起来会清楚很多。之后,用visNetwork可视化我们的节点和关系连线。代码和结果如下:
nodes$label <- nodes$name
nodes$title <- nodes$character
nodes$borderWidth<- 2
network<-visNetwork(nodes, edges)
图4 初步绘制的图
需要注意的是,这可不是一张静态图,我们把鼠标悬浮到某个节点上时,相应的属性就出现了。
03
美化交互式社会网络图
上图所有的节点,都是一样的颜色、形状,看起来不清楚,还容易混淆。我们希望依据不同的病例分类,重新绘制节点颜色以及形状,这样看得会更清晰。代码结果如下:
unique(nodes$classification)
###将nodes$group转换成因自行变量##
nodes$group <- factor(nodes$classification,levels = c( "既往感染者", "确诊病例", "无症状感染者"))
###定义颜色##
#节点填充颜色
nodes$color.background <- c( "#D8BFD8", "#FF6A6A", "#F0FFF0")[nodes$group]
#节点边框颜色
nodes$color.border <- c( "#D8BFD8", "#FF6A6A", "#F0FFF0")[nodes$group]
##定义节点边框##
nodes$shape <- c( "star", "box", "ellipse")[nodes$group]
##绘制网络关系图
network<-visNetwork(nodes, edges)
network
图5 经过美化的图
04
分组设置
这里节点较多,所有的情况都显示在一起,如果我们希望聚焦某一个分组该怎么办?
这里介绍其中一个选项。我们首先在visNetwork中,将网络内边的宽度设置为95%,整个网路图的高度设置为1000,再给它起一个标题“病例网络图”。接着利用selectedBy,指定我们让在病例分组“group”上进行分组选择,把它放在 visOptions中。
network <- visNetwork(nodes, edges,width = "95%", height = 1000,main= "病例网络图")%>%
visOptions(selectedBy = "group")
network
图6 添加分组选项的图
最后,我们再细微调节下整个 传播链图:
network <- visNetwork(nodes, edges,width = "95%", height = 1000,
main= "哈尔滨本土病例传播网络图")%>%
visNodes(font = list(color= "black",size= 30))%>%
visEdges(dashes = T,width = 3,length = 250,
font = list(color= "black",size= 30))%>%
visPhysics(solver = "forceAtlas2Based",
forceAtlas2Based = list(gravitationalConstant = - 100))%>%
visOptions(selectedBy = "group")%>%
visGroups(groupname = "既往感染者",color= "#D8BFD8")%>%
visGroups(groupname = "确诊病例",color= "#FF6A6A")%>%
visGroups(groupname = "无症状感染者",color= "#F0FFF0")%>%
visLegend(width = 0.1, position = "right", main = "图例")
network
在VisNodes中,调整字体参数font中的颜色和大小;在VisEdges中,同样调整参数font,并利用参数dashes将线条设置为虚线,线条宽度为3,长度为250;这里的VisPhysics可以调整你拉动节点时的感受,可以是引力也可以是斥力,可大也可小。
VisGroups根据我们数据中group的分类,显示分类对应的名称和颜色作为图例。最后利用VisLegend加入“图例“两字,调整宽度为0.1,放在图的最右方。该图仍有存在继续美化的空间,大家可自行尝试。
最后,我们使用visSave函数,将图片背景设置为白色,把制作的网络图保存为网页格式。
visSave(network, file = "哈尔滨病例交互式传播链.html", background = "white")
图7 哈尔滨本土病例传播网络关系
内容:董墨染
编辑:蔡敏
审核:肖建鹏、刘涛
指导:马文军
关于我们
《数据分析和应用》致力于为全国各地公共卫生与医学工作者(机构)提供专业可靠的统计咨询、研究设计、数据分析及调研报告等服务(详细见公众号菜单栏),欢迎有需要的人员和机构与我们联系。
微信号:gdiph-stat
点击此处“阅读全文”,稍后片刻,即可与图交互返回搜狐,查看更多