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

article/2025/9/17 10:06:50

引言

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

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

 

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

 

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

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

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

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

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

http://chatgpt.dhexx.cn/article/2stsnnRs.shtml

相关文章

复杂网络笔记-R语言

最近学习了下复杂网络相关的东西,总结了部分基础的理论,与使用R语言igraph包,总结如下,还需要继续深入,目前只学了皮毛。 复杂网络的复杂性 1、结构复杂性 网络连接结构看上去错综复杂,网络连接结构可能…

R语言神经网络

R语言中已经有许多用于神经网络的package。例如nnet、AMORE以及neuralnet,nnet提供了最常见的前馈反向传播神经网络算法。 AMORE包则更进一步提供了更为丰富的控制参数,并可以增加多个隐藏层。 neuralnet包的改进在于提供了弹性反向传播算法和更多的激…

如何用 R 绘制交互式社会网络图?

挖掘社会关系网络,助你洞若观火。 需求 最近有个学生问我,如何绘制交互式社会网络图(Interactive Social Network Graph)? 之所以一定要交互式,是因为他的应用场景,是演示给客户。 他解释说&…

R语言如何绘制相互作用网络图(27)

1.什么是相互作用网络图? 生物网络是复杂网络,也是以系统科学的思想研究生命科学的桥梁。网络中的节点可以是蛋白质,基因,RNA或DNA等,网络的边对应节点之间的物理、生化或功能上的相互作用。生物分子之间的相互作用并…

R语言网络分析2:graph函数和应用

产生网络 自定义 BioC 中用得最多的网络类型可能是 graphNEL 类。使用 graphNEL 类的同名函数可以产生自定义网络&#xff1a; library(graph)str(graphNEL) #> function (nodes character(), edgeL list(), edgemode "undirected") nds <- letters[1:3]…

在R语言中轻松创建关联网络

数据 ## Ozone Solar.R Wind Temp Month Day ## 1 41 190 7.4 67 5 1 ## 2 36 118 8.0 72 5 2 ## 3 12 149 12.6 74 5 3 ## 4 18 313 11.5 62 5 4 ## 5 NA NA 14.3 56 5 5 ## 6 28 …

(转载)攻击方式学习之(3) - 缓冲区溢出(Buffer Overflow)

堆栈溢出 堆栈溢出通常是所有的缓冲区溢出中最容易进行利用的。了解堆栈溢出之前&#xff0c;先了解以下几个概念&#xff1a; 缓冲区 简单说来是一块连续的计算机内存区域&#xff0c;可以保存相同数据类型的多个实例。 堆栈 堆 栈是一个在计算机科学中经常使用的抽象数据类型…

关于内核堆溢出漏洞的分析

一、漏洞背景 CVE-2021-22555是一个存在了15年之久的内核堆溢出漏洞&#xff0c;它位于内核的Netfilter组件中&#xff0c;这个组件可以被用来实现防火墙、NAT等功能。 该漏洞在2006年由commit 9fa492cdc160cd27ce1046cb36f47d3b2b1efa21引入&#xff0c;并在2021年由commit …

Linux kernel ‘qeth_snmp_command’函数缓冲区溢出漏洞

漏洞名称&#xff1a;Linux kernel ‘qeth_snmp_command’函数缓冲区溢出漏洞CNNVD编号&#xff1a;CNNVD-201311-423发布时间&#xff1a;2013-11-29更新时间&#xff1a;2013-11-29危害等级&#xff1a;中危 漏洞类型&#xff1a;缓冲区溢出威胁类型&#xff1a;本地CVE编号…

hackthebox-buff(gym渗透 端口转发 cloudme 缓冲区溢出 )

1、扫描 masscan快速全局扫&#xff0c;nmap具体扫。7680不知道&#xff0c;8080是web进去搜集信息。 C:\root> masscan -p1-65535,U:1-65535 10.10.10.198 --rate1000 -e tun0Starting masscan 1.0.5 (http://bit.ly/14GZzcT) at 2021-01-17 09:36:41 GMT-- forced optio…

20181018栈溢出

所有内容参考书籍《0day安全&#xff1a;软件漏洞分析技术&#xff08;第二版&#xff09;》 缓冲区溢出 简单来说&#xff0c;缓冲区艺术就是在大缓冲区中的数据向小缓冲区复制的过程中&#xff0c;由于没注意小缓冲区的边界&#xff0c;“撑爆”了较小的缓冲区&#xff0c;…

再谈关于缓冲器溢出

废话少说(说一句废话,这是入门级的) C/C的代码: // buffer overflow code by ctorenshenguo.com #include <windows.h>#include <stdio.h>void fnHack() //the host never expect to run this{ printf("Your computer has been hacked!\n"); //ex…

Go内存溢出与内存泄露

https://www.cnblogs.com/sunsky303/p/11077030.html 一、内存泄露与内存溢出的区别 内存溢出(out of memory&#xff0c;简称OOM) 内存溢出是指程序在申请内存时&#xff0c;没有足够的内存空间供其使用&#xff0c;简单点说就是你要求分配的内存超出了系统能给你的&#…

(原创)攻击方式学习之(3) - 缓冲区溢出(Buffer Overflow)

堆栈溢出 堆栈溢出通常是所有的缓冲区溢出中最容易进行利用的。了解堆栈溢出之前&#xff0c;先了解以下几个概念&#xff1a; 缓冲区 简单说来是一块连续的计算机内存区域&#xff0c;可以保存相同数据类型的多个实例。堆栈 堆 栈是一个在计算机科学中经常使用的抽象数据类型。…

攻击方式学习之(3) - 缓冲区溢出(Buffer Overflow) [zt]

堆栈溢出 堆栈溢出通常是所有的缓冲区溢出中最容易进行利用的。了解堆栈溢出之前&#xff0c;先了解以下几个概念&#xff1a; 缓冲区 简单说来是一块连续的计算机内存区域&#xff0c;可以保存相同数据类型的多个实例。 堆栈 堆 栈是一个在计算机科学中经常使用的抽象数据类型…

linux 远程溢出,Linux Kernel蓝牙CAPI报文远程溢出漏洞

Linux Kernel是开放源码操作系统Linux所使用的内核。 Linux Kernel对入站CAPI消息没有执行正确的处理&#xff0c;远程攻击者可能利用此漏洞在服务器上执行任意指令。 Linux Kernel代码的net/bluetooth/cmtp/capi.c文件中没有正确地处理入站的CAPI消息。如果用户发送了特制的CA…

linux远程溢出,linux-ftpd-ssl 远程溢出漏洞

linux-ftpd-ssl 远程溢出漏洞 2005-11-15 eNet&Ciweek 详细描述&#xff1a; linux-ftpd-ssl是一款支持加密的FTP server。 linux-ftpd-ssl软件包中存在远程溢出漏洞&#xff0c;恶意服务器可能利用此漏洞在主机上执行任意指令。 恶意服务器生成的超长响应命令可能会覆盖栈…

html溢出攻击,溢出(漏洞)攻击的实现及防御

前言 媒体上关于系统漏洞的话题一直不断&#xff0c;在我所接触的用一些朋友和用户中虽然也知道打系统补丁很重要&#xff0c;但却又一直不以为然总以为网络上的危险离自己很远&#xff0c;大部份人都认为进行一次远程攻击很困难甚至认为只要安装了防病毒软件就一切大吉&#x…

缓冲区溢出(Buffer Overflow)

堆栈溢出 堆栈溢出通常是所有的缓冲区溢出中最容易进行利用的。了解堆栈溢出之前&#xff0c;先了解以下几个概念&#xff1a; 缓冲区 简单说来是一块连续的计算机内存区域&#xff0c;可以保存相同数据类型的多个实例。堆栈 堆 栈是一个在计算机科学中经常使用的抽象数据类型…

永恒之蓝漏洞复现(Windows server 2008系列缓冲区溢出漏洞)

漏洞信息 漏洞名称&#xff1a;Windows server 2008系列缓冲区溢出漏洞 CVEID&#xff1a;2017-0144 漏洞类型&#xff1a;输入验证错误 威胁类型&#xff1a;远程 发布时间&#xff1a;2017-03-14 危害等级&#xff1a;高危 漏洞简介 Microsoft服务器消息块1.0&#xff08;…