科研学习|可视化——ggplot2版本的网络可视化

ggplot2是R语言中一个非常流行的数据可视化包,它也可以用于网络可视化。以下是三个基于ggplot2并专门用于网络可视化的R包:

  • ggnet2: 这个包的使用方法与传统的plot函数相似,易于使用。更多信息可在其官方页面查看:ggnet2

  • geomnet: 这个包在ggplot2中增加了geom_net层,可以使用数据框作为输入,并且可以与Plotly交互,从而支持交互式图形。有关更多信息,请访问:geomnet on GitHub 和 geomnet on CRAN

  • ggnetwork(首选): 这个包是三者中最灵活的,特别适合动态网络的可视化。它结合了ggplot2的优雅语法和网络数据的处理能力。更多信息可在其官方页面查看:ggnetwork

一、三个R包的比较

这三个包虽然都基于ggplot2进行网络可视化,但各有侧重和特点。您可以通过以下链接查看这三个包的详细比较:Comparison among ggnet2, geomnet, and ggnetwork

  • ggnet2 以其简单的语法和易用性而受到欢迎。

  • geomnet 通过增加可与ggplot2兼容的图层以及支持交互式图形(如与Plotly的整合),提供了额外的灵活性和功能。

  • ggnetwork 由于其在处理动态网络方面的优势,是最灵活的选择,适合需要高度定制化网络图的用户。

二、示例数据分析

这段文本提供了在R语言环境中使用多个包来处理和可视化足球比赛数据的例子。以下是步骤的详细说明:

2.1 安装和加载必要的包

这部分代码涉及安装并加载处理网络数据的几个R包。GGallygeomnetggnetwork 和 statnet 都是处理图形和网络数据的强大工具。

# 安装包
#install.packages("GGally")
#install.packages("geomnet")
#install.packages("ggnetwork")

# 加载包
library("GGally")
library("geomnet")
library("ggnetwork")
library("statnet")

2.2 加载数据

这里,数据集football来自geomnet包,包含足球队之间的比赛信息。

# 加载数据
data("football", package = "geomnet")
rownames(football$vertices) <- football$vertices$label

2.3 创建网络

使用边列表football$edges[,1:2]创建一个网络结构,这里用的是network::network()函数。

# 从边列表创建网络
fb.net = network::network(football$edges[,1:2])

2.4 添加顶点和边的属性

为网络中的顶点(足球队)添加属性,指明每个队伍所在的会议。此外,还为边添加属性,表示两个队伍是否属于同一会议。

# 添加顶点属性:队伍所在的会议
fb.net %v% "conf" <- football$vertices[network.vertex.names(fb.net), "value"]

# 添加边属性:两队是否同属一个会议
set.edge.attribute(fb.net, "same.conf", football$edges$same.conf)
set.edge.attribute(fb.net, "lty", ifelse(fb.net %e% "same.conf" == 1, 1, 2))

三、ggnet2

ggnet2是一个用于网络可视化的R包,它的特点如下:

3.1 功能特点

  • 输入:网络对象

  • 提供详细教程:ggnet2 教程

  • 语法类似于plot:使用简单,语法与传统的绘图函数类似

  • 输出:输出底层的组织结构(节点的位置),便于添加geom_xx

3.2 问题

  • 不支持曲线边缘

  • 不支持自环

  • 不适用于复杂图形

  • 对于变化的图表,不能直接提供多个面板。需要固定放置坐标。

3.3 示例代码

设置种子,确保结果的可重现性,并使用ggnet2来创建一个网络图表的示例。

set.seed(3212019)
pggnet2 = ggnet2(fb.net,  # 输入 `network` 对象
       mode = "fruchtermanreingold",  # 来自 `network` 包的布局
       layout.par = list(cell.jitter=0.75),  # 可以传递布局参数
       # 节点属性
       node.color = "conf", 
       palette = "Paired",  # 颜色板 palette="Set3",
       node.size = 5,
       # node.size = "degree",
       # size.cut = 3,  # 使用分位数将大小切割为三个类别
       # size = "conf",
       # 手动映射大小:size.palette = c("Atlantic Coast" = 1,...),
       # node.shape = "conf",
       node.alpha = 0.5,
       # node.label = TRUE,
       # 边缘
       edge.color = c("color", "grey50"),  # 第一个值:同一组的节点使用相同颜色,否则使用第二个参数
       edge.alpha = 0.5,
       edge.size = 0.3,
       edge.lty = "lty",
       # edge.label = 1,
       # edge.label.size = 1,
       # 图例
       color.legend = "Conference",
       # legend.size = 10,
       # legend.position = "bottom"
) + 
  geom_point(aes(color = color), size = 3)  # 可以像ggplot对象一样处理并添加geom_xx层
pggnet2

## 将其作为数据框处理以添加geom_xx层
pggnet2$data %>% names()
## [1] "label" "alpha" "color" "shape" "size"  "x"     "y"

此代码段展示了如何使用ggnet2包来构建并自定义网络图表的外观,通过控制节点和边的颜色、大小、透明度等属性,以及如何在ggplot2框架下增加额外的图形层。

四、geomnet

geomnet 是一个基于 ggplot2 的 R 包,用于网络可视化,特点如下:

4.1 功能特点

  • 输入:数据框

  • 支持自环

  • 支持面板(无法固定节点)

4.2 问题

  • 没有提供详细的教程

  • 底层结构不可用,被整体封装(例如:如果设置透明度,适用于节点和边缘;不提供点的位置)

  • 严格遵守 ggplot2 语法,灵活性较差

4.3 示例代码

以下是一个合并顶点和边缘数据,并使用 geomnet 创建网络图的例子:

# 合并顶点和边
ver.conf = football$vertices %>% mutate(from = label) %>% select(-label)
fb.df = left_join(football$edges, ver.conf, by = "from")

# 创建数据图
set.seed(3212019)
pgeomnet =
  ggplot(data = fb.df,  # 输入:数据框
         aes(from_id = from, to_id = to)) +
  geom_net(layout.alg = 'fruchtermanreingold',
           aes(colour = value, group = value,
               linetype = factor(same.conf != 1)),
           linewidth = 0.5,
           size = 5, vjust = -0.75, alpha = 1) +
  theme_net() +
  # theme(legend.position = "bottom") +
  scale_colour_brewer("Conference", palette = "Paired") +
  guides(linetype = FALSE)
pgeomnet

五、ggnetwork

ggnetwork 是一个专门用于网络可视化的 R 包,具有以下特点:

5.1 特点

  • 提供详细教程:ggnetwork 教程

  • 输入:可以是 igraph(需要加载 intergraph 库)或 network 对象

  • 语法非常用户友好

  • ggnetwork 提供底层的数据框

  • 使用 geom_edges 和 geom_nodes 分别设置;可以在 geom_xx 内设置针对边/节点的特定映射

  • 对于标签,支持 geom_(node/edge)(text/label)[_repel]:如 geom_nodetextgeom_nodelabelgeom_nodetext_repelgeom_nodelabel_repelgeom_edgetextgeom_edgelabelgeom_edgetext_repelgeom_edgelabel_repel

  • 允许曲线边缘(且与 plotly 兼容)

  • 可以使用面板展示动态网络,并固定节点位置

5.2 问题

  • 不支持自环

5.3 示例代码

这是一个使用 ggnetwork 包和 ggplot2 语法创建网络图的示例:

## 需要先安装 intergraph 包用于处理 igraph 对象
#install.packages("intergraph")
library("intergraph")

## 创建 igraph 对象
fb.igra = graph_from_data_frame(football$edges[,1:2], directed = FALSE)
V(fb.igra)$conf = football$vertices[V(fb.igra)$name, "value"]
E(fb.igra)$same.conf = football$edges$same.conf
E(fb.igra)$lty = ifelse(E(fb.igra)$same.conf == 1, 1, 2)

## 设置种子
set.seed(3212019)

## 使用 ggnetwork 和 ggplot 绘图
pggnetwork =
  ggplot(
    ggnetwork(  # 提供底层数据框
      fb.igra,  # 输入:网络对象
      layout = "fruchtermanreingold",  # 布局
      cell.jitter = 0.75
    ),
    aes(x, y, xend = xend, yend = yend)
  ) +
  geom_edges(
    aes(linetype = as.factor(same.conf)),
    color = "grey50",
    curvature = 0.2,
    alpha = 0.5
  ) +
  geom_nodes(
    aes(color = conf),
    size = 5,
    alpha = 0.5
  ) +
  scale_color_brewer("Conference", palette = "Paired") +
  scale_linetype_manual(values = c(2, 1)) +
  guides(linetype = FALSE) +
  theme_blank() + 
  geom_nodes(
    aes(color = conf),
    size = 3
  )  # 可以像 ggplot 对象一样处理并添加 geom_xx 层
pggnetwork

六、ggnet2、geomnet、ggnetwork 的扩展

由于这些工具的输出是 ggplot2 对象,它们可以与其他库如 plotly 结合,实现交互式网络可视化或动态网络可视化。

6.1 ggplot2 + plotly

使用 plotly 库,可以将 ggplot2 创建的静态图转换为交互式图表。以下是如何实现的:

6.2 加载 plotly 库

library("plotly")

6.3 将 ggplot2 对象转换为 plotly 对象

这里,pggnet2 和 pgeomnet 是使用 ggnet2 或 geomnet 创建的 ggplot2 图对象。通过使用 ggplotly() 函数,我们可以添加 coord_fixed() 来保持比例一致,并使用 hide_guides() 隐藏不必要的图例和指南。

ggplotly(pggnet2 + coord_fixed()) %>% hide_guides()
ggplotly(pgeomnet + coord_fixed()) %>% hide_guides()

注意,如果设置了边的 curvature 属性,plotly 可能无法正确显示这一属性。例如,下面的代码中暂时注释了对 pggnetwork 的转换:

# ggplotly(pggnetwork + coord_fixed()) %>% hide_guides()

6.4 创建新的网络图 pggnetwork2

下面的代码展示了如何使用 ggnetwork 创建一个网络对象,然后通过 ggplotly 转换为交互式图表。这里同样使用了 hide_guides() 来清洁图表的显示:

pggnetwork2 =
  ggplot(
    ggnetwork(  # 提供底层数据框
      fb.igra,  # 输入:网络对象
      layout = "fruchtermanreingold",  # 布局
      cell.jitter = 0.75
    ),
    aes(x, y, xend = xend, yend = yend)
  ) +  # 边的映射
  geom_edges(
    aes(linetype = as.factor(same.conf)),
    color = "grey50",
    alpha = 0.5
  ) +
  geom_nodes(
    aes(color = conf), 
    size = 5,
    alpha = 0.5
  ) +
  scale_color_brewer("Conference", palette = "Paired") +
  scale_linetype_manual(values = c(2, 1)) +
  guides(linetype = FALSE) +
  theme_blank() + 
  geom_nodes(
    aes(color = conf), 
    size = 3
  )
ggplotly(pggnetwork2 + coord_fixed()) %>% hide_guides()

七、分面动态网络

推荐使用 ggnetwork 来创建分面动态网络。

7.1 创建网络

以下示例使用了一个电子邮件数据集,其中包括节点和边的相关属性。

# 查看电子邮件数据集的边和节点的属性名
names(email$edges)
## [1] "From"        "eID"         "Date"        "Subject"     "to"         
## [6] "month"       "day"         "year"        "nrecipients"
names(email$nodes)
##  [1] "label"                      "LastName"                  
##  [3] "FirstName"                  "BirthDate"                 
##  [5] "BirthCountry"               "Gender"                    
##  [7] "CitizenshipCountry"         "CitizenshipBasis"          
##  [9] "CitizenshipStartDate"       "PassportCountry"           
## [11] "PassportIssueDate"          "PassportExpirationDate"    
## [13] "CurrentEmploymentType"      "CurrentEmploymentTitle"    
## [15] "CurrentEmploymentStartDate" "MilitaryServiceBranch"     
## [17] "MilitaryDischargeType"      "MilitaryDischargeDate"

# 从电子邮件数据集中提取边列表:移除发送给所有员工的电子邮件
edges = email$edges %>% filter(nrecipients < 54) %>% select(From, to, day)

# 创建网络对象
em.net <- network(edges[, 1:2])

# 分配边的属性(天)
set.edge.attribute(em.net, "day", edges[, 3])

# 分配节点的属性(员工类型)
em.cet <- as.character(email$nodes$CurrentEmploymentType)
names(em.cet) = email$nodes$label
em.net %v% "curr_empl_type" <- em.cet[network.vertex.names(em.net)]

# 设置种子以确保可重复性
set.seed(3212019)

# 使用 ggnetwork 创建可视化
ggplot(
  ggnetwork(
    em.net,
    arrow.gap = 0.02,  # 箭头间隙
    by = "day",        # 按天分面
    layout = "kamadakawai"  # 布局算法
  ),
  aes(x, y, xend = xend, yend = yend)
) +
  geom_edges(
    aes(color = curr_empl_type),
    alpha = 0.25,
    arrow = arrow(length = unit(5, "pt"), type = "closed")  # 定义箭头
  ) +
  geom_nodes(aes(color = curr_empl_type), size = 1.5) +  # 定义节点
  scale_color_brewer("Employment Type", palette = "Set1") +  # 颜色映射
  facet_wrap(. ~ day, nrow = 2, labeller = "label_both") +  # 分面显示
  theme_facet(legend.position = "bottom")  # 调整主题

注意:在运行代码时,如果检测到重复的边,可能会出现警告信息。这需要在数据预处理阶段进行检查和处理。

参考资料

https://briatte.github.io/ggnet/ https://cran.r-project.org/web/packages/ndtv/vignettes/ndtv.pdf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/600233.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python+flask+ldap3搭建简易版IDaaS系统(前端站点)

Python工具开源专栏 Py0006 pythonflaskldap3搭建简易版IDaaS系统&#xff08;前端站点&#xff09; Python工具开源专栏前言目录结构前端网站的部分演示首页查询数据数据同步数据关联查询系统日志 完整代码已在GitHub上开源 前言 pythonflaskldap3搭建简易版IDaaS系统的前端站…

VALSE 2024 Tutorial内容总结--开放词汇视觉感知

视觉与学习青年学者研讨会&#xff08;VALSE&#xff09;旨在为从事计算机视觉、图像处理、模式识别与机器学习研究的中国青年学者提供一个广泛而深入的学术交流平台。该平台旨在促进国内青年学者的思想交流和学术合作&#xff0c;以期在相关领域做出显著的学术贡献&#xff0c…

【Linux进程信号(一)】信号概念/产生/保存/处理

目录 入门 前&后台进程 前台进程&#xff1a; 后台进程 常用命令 ./XXX & fg命令 & bg命令 Ctrl c / Ctrl \ 信号的概念 信号的产生 1.键盘产生 2.系统调用指令 3.异常 4.软件条件 信号的保存 信号的处理 1.信号屏蔽字 2.未决信号表 3.信号处理…

layui 数据表格 自动定位新增行位置

由于数据表格新增行后没有到新增到当前位置 继续增加的需求&#xff1a; 因为自己是新增行后到最后一行的 所以 就定位到最后一行 并且 高亮 高亮颜色浅 可自行更改 整理了一下 可根据 情况 修改 // 初始化滚动条位置变量 let tableScroll {scrollTob: 0,scrollLeft: 0,…

【busybox记录】【shell指令】comm

目录 内容来源&#xff1a; 【GUN】【comm】指令介绍 【busybox】【comm】指令介绍 【linux】【comm】指令介绍 使用示例&#xff1a; 逐行比较两个排序后的文件 - 默认输出 逐行比较两个排序后的文件 - 如果一个文件的排序有问题&#xff0c;那么反错&#xff08;默认&…

口感与风味的完善结合:精酿啤酒的多样风格

啤酒的世界是丰富多彩的&#xff0c;不同的啤酒有着各自与众不同的口感和风味。而Fendi club啤酒&#xff0c;作为精酿啤酒的代表&#xff0c;以其多样化的风格和卓着的口感&#xff0c;吸引了无数啤酒爱好者的目光。 Fendi club啤酒的多样风格&#xff0c;首先体现在其原料的选…

医药垃圾分类管理系统|基于SSM医药垃圾分类管理系统的系统设计与实现(源码+数据库+文档)

医药垃圾分类管理系统 目录 基于SSM医药垃圾分类管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统登录模块 2管理员模块实现 3用户模块实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博…

1天搞定SpringBoot+Vue全栈开发 (8)前端路由VueRouter(进行组件切换)

1.VueRouter安装与使用 2.参数传递 创建路由组件 在项目中定义Discover.vue、Friends.vue、My.vue三个组件&#xff0c;将来要使用vue-router来控制它们的展示与切换&#xff1a; Discover.vue <template><div><h1>发现音乐</h1></div> <…

PE文件(四)FileBuffer-ImageBuffer

文件执行的总过程 当文件从硬盘中读入虚拟内存&#xff08;FileBuffer&#xff09;中时&#xff0c;文件数据会被原封不动的复制一份到虚拟内存中&#xff0c;然后进行拉伸对齐。此时虚拟内存中文件数据叫做文件印象或者内存印象&#xff0c;即ImageBuffer。此时ImageBuffer中…

Prompt提示词教程 | 提示工程指南 | 提示词示例 入门篇

在上一节中&#xff0c;我们介绍并给出了如何赋能大语言模型的基本示例。如果还没看而且是刚入门的同学建议看下&#xff0c;有个基本概念。 Prompt提示词教程 | 提示工程指南 | 提示工程简介https://blog.csdn.net/HRG520JN/article/details/138523705在本节中&#xff0c;我…

crossover怎么打开软件 mac怎么下载steam crossover下载的软件怎么运行

CrossOver是一款Mac和Linux平台上的类虚拟机软件&#xff0c;通过CrossOver可以运行Windows的可执行文件。如果你是Mac用户且需要使用CrossOver&#xff0c;但是不知道CrossOver怎么打开软件&#xff0c;如果你想在Mac电脑上玩Windows游戏&#xff0c;但不知道怎么下载Steam&am…

free5gc+ueransim配置

ueransim已完成配置&#xff0c;可以观察到在make后&#xff0c;ueransim的build下生成以下几个文件 nr-gnb-------------5G gnb&#xff08;RAN&#xff09;的主要可执行文件 nr ue---------------5G ue的主要可执行文件 nr-cli---------------5G gNB和UE的cli工具 nr-binder-…

从零开始的软件测试学习之旅(六)测试网络基础知识

测试网络基础知识 HTTP和HTMLURLDNS客户端和服务器请求方法和状态码面试高频Fiddler抓包工具教学弱网 HTTP和HTML 概念 html: HyperText Markup Language 超文本标记语言 http: HyperText Transfer Protocol 超文本传输协议 超文本: 图片, 音频, 视频 关系:http 可以对 html 的…

Cargo - 构建 rust项目、管理依赖包

文章目录 关于 Cargo构建项目创建工程编译运行buildclean 管理依赖添加依赖updatecheck计时 manual rust 安装可参考&#xff1a;https://blog.csdn.net/lovechris00/article/details/124808034 关于 Cargo Cargo 官方文档 &#xff1a; https://doc.rust-lang.org/cargo/crat…

QSPI的使用

Quad SPI接口(QSPI)是一种同步串行数据链路,在主模式下提供与外部设备的通信。它类似于SPI协议,只是它有额外的数据线。 普通SPI有四条通信线路:芯片选择、时钟、MOSI和MISO。对于QSPI,可提供额外的数据线。因此,命令/数据/地址是根据所选模式通过单、四或双IO发送的。由…

网络安全之动态路由OSPF基础

OSPF&#xff1a;开放式最短路径优先协议。 1、协议使用范围&#xff1a;IGP。 2、协议算法特点&#xff1a;链路状态型路由协议。 3、协议是否传递网络掩码&#xff1a;传递网络掩码&#xff08;无类别的路由协议&#xff09;。 4、协议封装&#xff1a;基于IP协议封装&am…

【Linux系统编程】1-文件IO操作

文章目录 1 概述2 文件描述符3 文件I/O操作3.1 打开文件操作3.2 关闭文件操作3.3 向文件写入数据3.4 从文件读取数据 4 给文件描述符添加非阻塞特性4.1 当此文件描述符不存在4.2 当此文件描述符存在 5 获取文件状态信息6 文件目录操作6.1 打开目录操作6.2 读取目录信息6.3 关闭…

窃鈇逃债,赧然惭愧——“天下共主”周赧王的结局

引子&#xff0c;债台高筑 周赧王五十九年&#xff08;前256年&#xff09;&#xff0c;雒邑王都内&#xff0c;大周第三十七代天子、年近八十的周赧王姬延困坐在王宫内的高台上&#xff0c;愁容满面、沮丧悲切、束手无策&#xff1b;而王宫宫墙外不远处&#xff0c;是一大帮举…

VMware与CentOS的安装

VMware与CentOS的安装 第一章 VMware安装第二章 CentOS上网虚拟机网络IP修改地址配置修改主机名和hosts文件修改主机名称配置Linux克隆机主机名称映射hosts文件&#xff0c;打开/etc/hosts 安装Xshell7和Xftp7 第一章 VMware安装 VMware Workstation Pro 安装包 …

【再探】设计模式—适配器、装饰及外观模式

结构型设计模式是用于设计对象和类之间关系的一组设计模式。一共有7种&#xff1a;适配器模式、装饰器模式、外观模式、桥接模式、组合模式、享元模式及代理模式。 1 适配器模式 需求&#xff1a;在软件维护阶段&#xff0c;已存在的方法与目标接口不匹配&#xff0c;需要个中…
最新文章