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

2024-05-07 23:28

本文主要是介绍科研学习|可视化——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

这篇关于科研学习|可视化——ggplot2版本的网络可视化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/968692

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依