引言
在数据可视化领域,关系网络数据的可视化一直是一个受到广泛关注的话题。
我们经常会看到这样的复杂网络关系图。
也会经常看到一些影视作品的人物关系图,例如:
我们可以从图中清晰地了解到不同人物之间的关系,但是这样静态的图片无法满足我们的一些深层次需求,比如:
如何快速找到一个人物(节点)?
能否单击某个节点,只显示该节点及其相邻节点?
能否点击一个节点弹出该节点相应的描述?
这些功能是静态的网络图无法实现的,它通常需要引入JavaScript,来实现交互功能。
如果我们不懂JavaScript,应该怎么办呢?
别担心,有句话说“总有一个R包能帮助你解决问题”,使用networkD3包,可以轻松帮助你实现绘制炫酷动态网络的梦想。
networkD3包基于D3.JS(最流行的可视化库之一)构建,还可以和R中常见的网络可视化包例如network、igraph等连用,支持管道操作符%>%(dplyr中常用,读者可自行学习)和ggplot2语法,是一个非常灵活的网络可视化包,包的作者在Stackoverflow上也非常活跃,经常会解答一些使用者提出的问题。
下面我们一起来学习一下吧~
实例操作
包的准备
#安装并加载包
install.packages('networkD3')
library('networkD3')
数据的准备
网络的基本元素是边和节点,在人物关系图中,人物就是节点,而他们之间的关系(朋友、家人)就是边。
通常我们需要提供两个数据集,节点数据集和边数据集,因为节点数据集可以从边数据集中获取,所以至少我们需要一个边数据集,现在让我们创建一个。
#起点
src
#终点
target
#创建边数据集
networkData
现在我们创建了一个边数据集networkData,如下图所示。
我们可以利用这个数据,生成一个最简单的动态网络。
绘制简单网络
simpleNetwork(networkData)
生成结果如下图所示:
我们可以看到,使用simplenetwork已经可以生成一个最基本的动态网络图,还可以通过修改其中的一些参数,来修改节点、边的颜色、透明度、节点之间的距离、字体字号等等,但如果我们有更深次的需求,比如将不同节点分组,并用不同的颜色表示;或者用边的粗细来表示关系的亲疏;或者我们文章开篇说的交互式的体验,比如,搜索一个节点,或者点击某节点出现描述,我们就需要使用networkD3包的另一个函数forceNetwork。
复杂网络定制
我们将首先使用networkD3自带的数据集为大家说明一下forceNetwork的基本语法。首先,我们导入数据
#边数据集
data(MisLinks)
#节点数据集
data(MisNodes)
我们分别看一下这两个数据集的结构。点数据集MisNodes,共包含三列,节点名称,节点分组,节点大小(重要性、集中度)。
边数据集MisLinks,共包含三列,依次是起点、终点、边的粗细(大小、权重)。
我们需要注意的是,在边数据集里,我们用节点的ID来代替节点本身,networkD3包是从0开始编号的,因此边数据集的第一条(1,0)对应到节点数据集则是(Napoleon,Myriel)。
在绘图前,我们应当先将数据整理成上述形式,然后将数据集传入到forceNetwork中。
以下的参数是必须提供的:
forceNetwork(
#边数据集
Links = MisLinks,
# 节点数据集
Nodes = Misnodes,
#边数据集中起点对应的列
Source = "source",
# 边数据集中终点对应的列
Target = "target",
# 边数据集中边的宽度对应的列
Value = "value",
# 节点数据集中节点名称对应的列
NodeID = "name",
# 节点数据集中节点分组对应的列
Group = "group",
)
上述代码运行后,我们得到一张关系图:
为了更好满足我们的定制需求,forceNetwork还提供了其他的一些参数供我们修改,我们可以有选择地把这些参数加入forceNetwork()里,=后面的内容大家都可以根据自己的需要进行修改,达到最满意的视觉效果。
下面给出一些参数的示例:
# 图宽度
width = 1200
# 图高度
height = 500
# 图是否允许缩放
zoom = T
# 图是否有边界
bounded=T
# 图是否显示图例
legend=T
# 鼠标没有停留时其他节点名称的透明度
opacityNoHover = 1
# 所有节点初始透明度
opacity = 1
# 节点斥力大小(负值越大斥力越大)
charge=-50
# 节点颜色,可以建立不同分组和颜色的一一映射关系
ColourScale
.domain(["A", "B"])
.range(["#FF6900", "#694489"]);'
# 节点比例大小
Nodesize = "size"
# 节点绝对大小
radiusCalculation = JS(" d.nodesize")
# 节点名称的字体
fontFamily = "黑体"
# 节点名称的字号
fontSize = 16
# 边是否显示箭头
arrows = F
# 边颜色,Cols可以是一个预先设置的列表
linkColour = Cols
# 鼠标点击事件
clickAction = clickJS
加入这些参数后,我们可以说是“为所欲为”了。
networkD3最大的亮点,在于clickAction = clickJS这一句,你可以设置自己的鼠标点击事件,比如节点放大,弹出对话框,点击节点显示节点描述,加入搜索框等等。
这些事件都是用JavaScript语言写的,如果你对此一无所知也不用担心,你可以先在别人的代码基础上进行修改,如果有兴趣的话再进一步深入。
案例展示
下面展示一个用networkD3包绘制的动态网络关系图。
基本的界面:
搜索节点:
在图的右上角显示节点描述:
networkD3包生成的结果将是一个html文件,即网页文件(当然你也可以把它保存成静态图片的格式),这个文件里已经包括了数据,你只要将这个文件发给别人,别人就可以看到你绘制好的图了。如果你有一个个人网站,将网页上传到网站,就可以建立一个炫酷的网络可视化展示界面啦。
将网络数据可视化的最终目的是为了向他人更清晰地呈现数据本身,而networkD3包用最简单的几行代码帮我们实现了这个目的,这么有趣又实用的工具,不想一起探索一下吗?
参考文献
Package ‘networkD3’, https://cran.r-project.org/web/packages/networkD3/networkD3.pdf
CUSTOM NETWORK CHART | NETWORKD3, https://www.r-graph-gallery.com/253-custom-network-chart-networkd3/
Network visualization with R, http://kateto.net/network-visualization
Introduction to Network Analysis with R, https://www.jessesadler.com/post/network-analysis-with-r/
▼欢迎关注《统计咨询》公众号▼
▼扫码赞赏▼
领取专属 10元无门槛券
私享最新 技术干货