[SNA社会网络分析]基于R的ndtv、network包实现社会网络动态可视化
本文所涉及的内容是在做传染病领域的科研时做的一些探索性的工作,肯定还是有一些不完善的地方,欢迎讨论。
本文最终的目的是实现一个社会网络的动态演变过程,如下图所示,这是程序最终生成的视频,导出的一小段GIF。
照惯例推荐几篇非常好的参考文章,建议均至少通读一遍:
1. http://statnet.csde.washington.edu/workshops/SUNBELT/current/ndtv/ndtv_workshop.html
2. Network visualization with R,PolNet 2018 Workshop, Washington, DC
3. R的ndtv包、networkDynamic包帮助文档
我的数据里有30万个独立的社会网络,最大的一个3000多人,我的R语言非常小白,所以用java写了一个工具,实现的功能是用户随便输入一个community的编号即可,视频就自动生成了,不用敲其他任何代码,在这里我把R的代码贴上,有些中间数据是用java生成的,我都会标出来。
library(network)
library(ndtv)nodes <- read.csv("F:/HIV & Drug analysis/Social network/data/34499/nodes.csv", header=T, as.is=T)
edges <- read.csv("F:/HIV & Drug analysis/Social network/data/34499/edges.csv", header=T, as.is=T)
上述代码首先读入节点表和边表,节点表就记录每个节点的ID,边表记录源节点、目标节点的ID、关系类型、权重。如下图:
net <- network(edges, vertex.attr=nodes, matrix.type="edgelist", loops=F, multiple=F, ignore.eval = F)ns <- data.frame(read.csv("F:/HIV & Drug analysis/Social network/data/34499/ns.csv",header=T, as.is=T))
es <- data.frame(read.csv("F:/HIV & Drug analysis/Social network/data/34499/es.csv",header=T, as.is=T))
上述代码一个作用是创建一个network对象,另一个就是读入节点和边的动态变化数据,ns和es的格式如下:
比如ns文件的第一行的意思就是节点1出现的时刻是85,消失时刻为178;
es文件的第一行意思就是源节点98,目标节点68的边,出现时刻为154,消失时刻为178。
当然上述4个文件你都可以存储在内存中,不需要保存成文件。继续往下看:
activate.vertex.attribute(net,'color','black',onset=-Inf,terminus=Inf)
activate.vertex.attribute(net,'color','green',onset=117,terminus=178,v=1)
activate.vertex.attribute(net,'color','green',onset=94,terminus=178,v=2)
activate.vertex.attribute(net,'color','green',onset=80,terminus=178,v=3)
activate.vertex.attribute(net,'color','green',onset=162,terminus=178,v=14)
###这里记录你需要动态变更颜色的节点
上述代码记录你需要变更颜色的节点,注意,第一行的意思是所有节点的初始颜色都是黑色的,从开始到结束。边的颜色、节点的大小、边的宽度都可以动态设置,参考文章前面推荐的文献。
第二行代码的意思就是编号为1的节点,从时刻117到时刻178,这期间的颜色设置为绿色。
net.dyn <- networkDynamic(base.net=net, edge.spells=es, vertex.spells=ns)
上述代码创建networkDynamic对象,把由静态数据nodes、edges构建的net对象和动态数据ns、es结合在了一起。
compute.animation(net.dyn, animation.mode = "MDSJ",slice.par=list(start=1, end=178, interval=1, aggregate.dur=1, rule='any'))
上述代码用来计算每一个时刻的布局,使用的算法是MDSJ,开始时刻、结束时刻、间隔时间要根据自己数据的情况设置一下。关于布局算法建议好好看一下我文章开头推荐的第一篇文章里介绍的各种布局算法,再结合自己的数据测试一下。
saveVideo(
render.animation(
net.dyn,
render.par = list(tween.frames = 25, show.time = FALSE, show.stats = NULL, extraPlotCmds=NULL),
#tween.frames应该类似于帧数,越大越平滑
plot.par = list(bg='white'),
ani.options = list(interval=0.02),
#这里的interval参数越小,视频播放越快
render.cache = 'none',
#不缓存在内存中,直接写入硬盘,数据量大建议配置成none
verbose=TRUE,
usearrows=FALSE,
#是否使用有向边
vertex.col='color',
#重要!!指定节点的颜色是名为color的列
vertex.cex = 0.5,
#节点大小
edge.lwd = 1,
#边的宽度
edge.col='black',
#边的颜色
displaylabels=FALSE),
video.name="F:/HIV & Drug analysis/Social network/video/Network-34499-Dynamic.mp4",
ani.width=1000,ani.height=1000,
#画布的长和宽,建议配置在2000以下,2000以上有些播放器播放时会报错
other.opts="-b:v 5000k")
暂时结束,利用tsna应该可以在这个过程中做一些动态的网络分析,抽取一些信息出来,后边再看吧。文章最后附上整个源代码:
library(network)
library(ndtv)nodes <- read.csv("F:/HIV & Drug analysis/Social network/data/34499/nodes.csv", header=T, as.is=T)
edges <- read.csv("F:/HIV & Drug analysis/Social network/data/34499/edges.csv", header=T, as.is=T)net <- network(edges, vertex.attr=nodes, matrix.type="edgelist", loops=F, multiple=F, ignore.eval = F)ns <- data.frame(read.csv("F:/HIV & Drug analysis/Social network/data/34499/ns.csv",header=T, as.is=T))
es <- data.frame(read.csv("F:/HIV & Drug analysis/Social network/data/34499/es.csv",header=T, as.is=T))activate.vertex.attribute(net,'color','black',onset=-Inf,terminus=Inf)
activate.vertex.attribute(net,'color','green',onset=117,terminus=178,v=1)
activate.vertex.attribute(net,'color','green',onset=94,terminus=178,v=2)
activate.vertex.attribute(net,'color','green',onset=80,terminus=178,v=3)
activate.vertex.attribute(net,'color','green',onset=162,terminus=178,v=14)
activate.vertex.attribute(net,'color','green',onset=145,terminus=178,v=15)
activate.vertex.attribute(net,'color','green',onset=98,terminus=178,v=16)
activate.vertex.attribute(net,'color','green',onset=60,terminus=178,v=21)
activate.vertex.attribute(net,'color','green',onset=71,terminus=178,v=22)
activate.vertex.attribute(net,'color','green',onset=69,terminus=178,v=30)
activate.vertex.attribute(net,'color','green',onset=69,terminus=178,v=32)
activate.vertex.attribute(net,'color','green',onset=140,terminus=178,v=33)
activate.vertex.attribute(net,'color','green',onset=119,terminus=178,v=34)
activate.vertex.attribute(net,'color','green',onset=90,terminus=178,v=35)
activate.vertex.attribute(net,'color','green',onset=92,terminus=178,v=37)
activate.vertex.attribute(net,'color','green',onset=94,terminus=178,v=38)
activate.vertex.attribute(net,'color','green',onset=94,terminus=178,v=39)
activate.vertex.attribute(net,'color','green',onset=78,terminus=178,v=40)
activate.vertex.attribute(net,'color','green',onset=78,terminus=178,v=41)
activate.vertex.attribute(net,'color','green',onset=98,terminus=178,v=42)
activate.vertex.attribute(net,'color','green',onset=98,terminus=178,v=43)
activate.vertex.attribute(net,'color','green',onset=149,terminus=178,v=44)
activate.vertex.attribute(net,'color','green',onset=162,terminus=178,v=45)
activate.vertex.attribute(net,'color','green',onset=21,terminus=178,v=57)
activate.vertex.attribute(net,'color','green',onset=39,terminus=178,v=58)
activate.vertex.attribute(net,'color','green',onset=44,terminus=178,v=59)
activate.vertex.attribute(net,'color','green',onset=62,terminus=178,v=60)
activate.vertex.attribute(net,'color','green',onset=72,terminus=178,v=62)
activate.vertex.attribute(net,'color','green',onset=100,terminus=178,v=66)
activate.vertex.attribute(net,'color','green',onset=111,terminus=178,v=67)
activate.vertex.attribute(net,'color','green',onset=155,terminus=178,v=68)
activate.vertex.attribute(net,'color','green',onset=108,terminus=178,v=74)
activate.vertex.attribute(net,'color','green',onset=126,terminus=178,v=80)
activate.vertex.attribute(net,'color','green',onset=110,terminus=178,v=84)
activate.vertex.attribute(net,'color','green',onset=37,terminus=178,v=88)
activate.vertex.attribute(net,'color','green',onset=25,terminus=178,v=89)
activate.vertex.attribute(net,'color','green',onset=23,terminus=178,v=90)
activate.vertex.attribute(net,'color','green',onset=18,terminus=178,v=91)
activate.vertex.attribute(net,'color','green',onset=16,terminus=178,v=92)
activate.vertex.attribute(net,'color','green',onset=50,terminus=178,v=93)
activate.vertex.attribute(net,'color','green',onset=30,terminus=178,v=97)
activate.vertex.attribute(net,'color','green',onset=27,terminus=178,v=98)
activate.vertex.attribute(net,'color','green',onset=16,terminus=178,v=99)net.dyn <- networkDynamic(base.net=net, edge.spells=es, vertex.spells=ns)compute.animation(net.dyn, animation.mode = "MDSJ",slice.par=list(start=1, end=178, interval=1, aggregate.dur=1, rule='any'))saveVideo(
render.animation(
net.dyn,
render.par = list(tween.frames = 25, show.time = FALSE, show.stats = NULL, extraPlotCmds=NULL),
plot.par = list(bg='white'),
ani.options = list(interval=0.02),
render.cache = 'none',
verbose=TRUE,
usearrows=FALSE,
vertex.col='color',
vertex.cex = 0.5,
edge.lwd = 1,
edge.col='black',
displaylabels=FALSE),
video.name="F:/HIV & Drug analysis/Social network/video/Network-34499-Dynamic.mp4",
ani.width=1000,ani.height=1000,
other.opts="-b:v 5000k")
[SNA社会网络分析]基于R的ndtv、network包实现社会网络动态可视化相关推荐
- R语言使用timeROC包计算无竞争情况下的生存资料多时间AUC值、R语言使用timeROC包的plotAUCcurve函数可视化多时间生存资料的不同标记物情况下对应的AUC曲线、并进行对比
R语言使用timeROC包计算无竞争情况下的生存资料多时间AUC值.R语言使用timeROC包的plotAUCcurve函数可视化多时间生存资料的不同标记物情况下对应的AUC曲线.并进行对比 目录
- R语言使用GGally包的ggpairs函数可视化变量相关性分析图:包含散点图、密度图、柱状图、箱图等、并自定义数据点的大小
R语言使用GGally包的ggpairs函数可视化变量相关性分析图:包含散点图.密度图.柱状图.箱图等.并自定义数据点的大小 目录
- R语言使用hexbin包的hexbin函数可视化散点图、应对数据量太大、且有数据重叠的情况、普通散点图可视化效果变差的情况、提供了对六边形单元格的二元绑定、通过图例颜色标定每一个区域数据点的数量
R语言使用hexbin包的hexbin函数可视化散点图.应对数据量太大.且有数据重叠的情况.普通散点图可视化效果变差的情况.hexbin函数提供了对六边形单元格的二元绑定.通过图例颜色标定每一个区域数 ...
- R语言使用GGally包的ggparcoord函数可视化多变量的平行坐标轴图(parallel coordinates plot)、当排序点图的数据对象变多的可视化效果变差的时候
R语言使用GGally包的ggparcoord函数可视化多变量的平行坐标轴图(parallel coordinates plot).当排序点图的数据对象变多的可视化效果变差的时候 目录
- R语言使用scatterplot3d包的scatterplot3d函数可视化3D散点图(3D scatter plots)、在3D散点图中添加垂直线和数据点描影、3D图中添加回归平面
R语言使用scatterplot3d包的scatterplot3d函数可视化3D散点图(3D scatter plots).在3D散点图中添加垂直线和数据点描影.3D图中添加回归平面(overlaid ...
- R语言使用car包的scatter3d函数可视化可以交互旋转的3D散点图(Spinning 3D scatter plot by the scatter3d() function of car)
R语言使用car包的scatter3d函数可视化可以交互旋转的3D散点图(Spinning 3D scatter plot produced by the scatter3d() function i ...
- R语言使用ggpubr包的ggbarplot函数可视化水平偏差条形图(计算数值的z-score、自定义填充色、自定义条形边缘色、自定义调色板、条形图全局排序从小到大、文本标签角度、添加图例标签、轴标签
R语言使用ggpubr包的ggbarplot函数可视化水平偏差条形图(计算数值的z-score.自定义填充色.自定义条形边缘色.自定义调色板.条形图全局排序从小到大.文本标签角度.添加图例标签.轴标签 ...
- R语言使用ggpubr包的ggbarplot函数可视化分组条形图(grouped bar plot)、并添加误差条(error bar、误差条显示平均值+/-sd)、不添加填充色、添加jitter抖动
R语言使用ggpubr包的ggbarplot函数可视化分组条形图(grouped bar plot).并添加误差条(error bar.误差条显示平均值+/-sd).不添加填充色.添加jitter抖动 ...
- R语言使用ggpubr包的ggdotplot函数可视化水平棒棒糖图(自定义分组数据点色彩、自定义调色板、在两端添加点图的线段segments、整体排序从大到小、自定义数据点的大小、添加数值标签)
R语言使用ggpubr包的ggdotplot函数可视化水平棒棒糖图(自定义分组数据点色彩.自定义调色板.在两端添加点图的线段segments.整体排序从大到小.自定义数据点的大小.添加数值标签) 目录
最新文章
- g++报错解决:error: ‘setw’ is not a member of ‘std’
- delphi 读取ini所有项_财务机器人真的会代替财务人员所有工作吗?
- Perl新接触的小命令
- .Net 零星小知识
- 崩坏3服务器维护多久,崩坏35月28日停服维护多久?4.0版本更新内容汇总[图]
- Visual Studio LightSwitch初体验和定位看法
- 卫星参数大全_【视频】早期国外做工精良的海事卫星电话机拆解
- POJ 1723 Soldiers (中位数)
- 不要打2岁内和6岁后的孩子 父母必看
- python操作符op_详解python中的 is 操作符
- Vue中引入css文件
- 华为机试HJ4:字符串分隔
- rsync 使用小记
- Error [ERR_INSPECTOR_ALREADY_ACTIVATED]解决方案
- php 导出excel的三种方法
- xmpp java_XMPP: Android基于Xmpp的即时通讯
- catia如何测量毛料尺寸_CATIA建模规定
- 中标麒麟linux配置网卡,中标麒麟Linux v7系统下设置双网卡bond或team绑定详细过程...
- Java内存中神奇的64MB
- RTX3070Ti和RTX2080Ti哪个强 RTX3070Ti和RTX2080Ti参数对比哪个好
热门文章
- 申请计算机博士需要的论文,计算机科学与技术学院申请博士学位发表学术论文的规定(2008.9上网).doc...
- mongodb遍历万亿级数据,论索引的重要性
- led和cob灯的区别
- 香港国际珠宝展及香港国际钻石、宝石及珍珠展揭幕
- signature=00e3717ebf4d3479c02d1e8e6e919c84,MS12-037:Internet Explorer 的累積安全性更新:2012 年 6 月 12 日...
- 101 个 MySQL 的调节和优化的提示(转osc)
- 征女友(搞笑)(转)
- 马云正式卸任:一文回顾马云的区块链“阳谋”
- 关于惯性传感器(陀螺仪、加速度计)的选取
- 机器学习 --- 模型评估、选择与验证