使用R包networkD3绘制炫酷的动态关系网络

引言

在数据可视化领域,关系网络数据的可视化一直是一个受到广泛关注的话题。

我们经常会看到这样的复杂网络关系图。

也会经常看到一些影视作品的人物关系图,例如:

我们可以从图中清晰地了解到不同人物之间的关系,但是这样静态的图片无法满足我们的一些深层次需求,比如:

如何快速找到一个人物(节点)?

能否单击某个节点,只显示该节点及其相邻节点?

能否点击一个节点弹出该节点相应的描述?

这些功能是静态的网络图无法实现的,它通常需要引入JavaScript,来实现交互功能。

如果我们不懂JavaScript,应该怎么办呢?

别担心,有句话说“总有一个R包能帮助你解决问题”,使用networkD3包,可以轻松帮助你实现绘制炫酷动态网络的梦想。

networkD3包基于D3.JS(最流行的可视化库之一)构建,还可以和R中常见的网络可视化包例如networkigraph等连用,支持管道操作符%>%(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/

▼欢迎关注《统计咨询》公众号▼

▼扫码赞赏▼

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180323B0AM3P00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券