引言

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

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

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

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

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

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

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

这些功能是静态的网络图无法实现的,它通常需要引入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/

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

  • 发表于: 2018-03-26
  • 原文链接:http://kuaibao.qq.com/s/20180323B0AM3P00?refer=cp_1026

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

  1. 如何利用pyecharts绘制炫酷的关系网络图?

    如何利用pyecharts绘制炫酷的关系网络图 这是本学期在大数据哲学与社会科学实验室做的第六次分享了. 第一次分享的是: 如何利用"wordcloud+jieba"制作中文词云? ...

  2. 出彩的毕业论文岂能没有几张炫酷图表???(来看一下matplotlib怎样绘制炫酷表格)(上)

    不知不觉在家已经待了三个多月,其他年级还好,在家写论文的小伙伴们不知进展如何?想要写一篇出彩得到导师赏识的文章,里面还能少得了几张炫酷的图表?这篇博客将写一下怎样用Python中matplotlib包 ...

  3. R包ComplexHeatmap绘制个性化热图

    使用ComplexHeatmap包绘制个性化热图 作者:刘梦瑶 诺禾致源 微生物信息 审稿:刘永鑫 中国科学院遗传与发育生物学研究所 ComplexHeatmap包由顾祖光博士创建,是一个非常全面的绘 ...

  4. 如何绘制炫酷的韦恩图(薇恩图)Venn diagram

    如何绘制炫酷的韦恩图(薇恩图)Venn diagram https://mp.weixin.qq.com/s/7eL01UAfV3O1l-yi8r-IPQ 都可以通过OmicShare云工具平台(ht ...

  5. coreldraw做生化标志_CorelDraw绘制炫酷的中文立体字海报

    今天为大家分享CorelDraw绘制炫酷的中文立体字海报方法,教程很简单,适合新手来学习,步骤也不是很复杂,推荐过来,希望大家喜欢! 先看看效果图 第一.打上招聘两个字,选择一个喜欢的字体,如下. 第 ...

  6. 【Python】精选30张炫酷的动态交互式图表,Pandas一键生成,通俗易懂

    今天小编来讲一下如何用一行代码在DataFrame数据集当中生成炫酷的动态交互式的图表,我们先来介绍一下这次需要用到的模块cufflinks 就像是seaborn封装了matplotlib一样,cuf ...

  7. 精选30张炫酷的动态交互式图表,Pandas一键生成,通俗易懂

    今天小编来讲一下如何用一行代码在DataFrame数据集当中生成炫酷的动态交互式的图表,我们先来介绍一下这次需要用到的模块cufflinks 就像是seaborn封装了matplotlib一样,cuf ...

  8. 30张炫酷的动态交互式图表,Python 一键即可生成

    今天我来讲一下如何用 Python 一行代码在DataFrame数据集当中生成炫酷的动态交互式的图表,本文中我们需要用到的模块cufflinks ,就像是seaborn封装了matplotlib一样, ...

  9. 最新超炫酷的动态引导页官网HTML源码

    正文: 最新超炫酷的动态引导页官网HTML源码,背景是动态的,非常炫酷,有兴趣的自行去体验吧,其它就没什么好介绍的了. 程序: wwxegu.lanzoui.com/iOt9B0h05iof 图片:

最新文章

  1. 回馈读者【赠技术书通知】
  2. 工具--Eclipse/MarkDown/XMind文章分类目录
  3. MySQL性能优化的最佳经验
  4. EncryptionHelper.cs(20170223)
  5. .NET 获取类型中的属性
  6. 13.15. ftp fs
  7. hexo 环境变量_优雅的博客框架,快速、简洁、高效且主题丰富——Hexo
  8. 定义一个基类BAse,有两个公有成员函数fn1,fn2;私有派生出derived类,如何通过derived类的对象调用基类的函数fn1;
  9. EOJ 2990 文献排序 C语言
  10. 电子设计教程39:软启动电路-观察浪涌电流
  11. 【2021牛客暑期多校训练营7 】 xay loves count
  12. 樱花动漫视频数据表分析樱花动漫
  13. 锻造宝剑!如何用一款手机打造一个移动渗透工具箱??
  14. og协议-有利于SNS网站分享
  15. 【水滴云|热点】个人信息安全有法可依,海量数据用IPFS存储
  16. 零基础学python-2.24 一些常用函数
  17. C语言中四种取整方式、取余/取模的运算以及负数取模的问题
  18. 前端开发中需要用到的变换矩阵(2D游戏适用)
  19. React-activation使用
  20. 锐龙7000PBO温度墙设置

热门文章

  1. u检验、t检验、F检验、卡方检验详细分析
  2. 《机器学习实战》— k-近邻算法
  3. 上传多个文件html文件内容吗,html5 – 使用Rook上传多个文件
  4. random.seed(seed)、np.random.seed(seed)、torch.manual_seed(seed)作用
  5. 中等专业学校计算机教师,中等专业学校计算机班主任老师年度工作总结
  6. 游戏开发论坛_游戏开发制作全流程介绍
  7. 解决ROS中运行launch文件报错ERROR: cannot launch node of type[xxx/xxx]:xxx的问题办法最全汇总
  8. 腾讯企业 html邮件模板,python连接腾讯企业邮箱发送html邮件
  9. 【09年特长生第四题】开发区规划
  10. 【转】期限结构Carry收益 期货多品种对冲模型