❝本节来介绍如何使用igraph+scatterpie来绘制网络饼图,下面小编就通过一个案例来进行展示数据为随意构建无实际意义仅作图形展示用,添加了详细的注释希望各位观众老爷能够喜欢 ❞
library(tidyverse)
library(igraph)
library(ggraph)
library(graphlayouts)
library(ggforce)
library(scatterpie)
library(ggsci)
# 设置随机种子,确保结果的可复现性
set.seed(1439)
# 使用sample_pa函数生成一个包含20个节点的随机无标度网络
g <- sample_pa(20, 1)
# 为网络中的每个节点添加名为"A"的属性,属性值为从均值为0,标准差为1的正态分布中随机生成的绝对值
V(g)$A <- abs(rnorm(20, sd = 1))
# 为网络中的每个节点添加名为"B"的属性,属性值为从均值为0,标准差为2的正态分布中随机生成的绝对值
V(g)$B <- abs(rnorm(20, sd = 2))
# 为网络中的每个节点添加名为"C"的属性,属性值为从均值为0,标准差为3的正态分布中随机生成的绝对值
V(g)$C <- abs(rnorm(20, sd = 3))
# 使用layout_with_stress函数计算节点的布局坐标
xy <- layout_with_stress(g)
# 将计算得到的节点布局坐标分别赋值给节点属性"x"和"y"
V(g)$x <- xy[, 1]
V(g)$y <- xy[, 2]
# 使用ggraph函数绘制图形,使用"manual"布局,节点的x和y坐标从属性中获取
ggraph(g, "manual", x = V(g)$x, y = V(g)$y) +
# 添加边的可视化,使用geom_edge_link0函数
geom_edge_link0() +
# 添加饼图散点,表示节点属性"A"、"B"和"C"的比例
geom_scatterpie(cols = c("A", "B", "C"),
data = as_data_frame(g, "vertices"),
colour = NA, pie_scale = 2) +
coord_fixed() + # 设置坐标系为等比例缩放
theme_graph() +
theme(legend.position = "bottom")
# 生成一个包含9个岛屿、40个节点、连接概率为0.4、平均度数为15的网络图
g <- sample_islands(9, 40, 0.4, 15)
# 使用igraph包中的simplify函数简化网络图,去除重复边和自环
g <- igraph::simplify(g)
# 为每个节点添加名为"grp"的属性,属性值为重复的1到9,每个值重复40次
V(g)$grp <- as.character(rep(1:9, each = 40))
# 为每个节点添加名为"cat"的属性,属性值从"A"、"B"、"C"中随机采样得到,有放回
V(g)$cat <- sample(c("A", "B", "C"), vcount(g), replace = TRUE)
# 合并同一组内的节点,形成新的图g_clu,并使用"concat"方式合并节点属性
g_clu <- contract(g, V(g)$grp, vertex.attr.comb = "concat")
# 为新图g_clu的边添加名为"weight"的属性,所有边的权重设置为1
E(g_clu)$weight <- 1
# 使用simplify函数简化新图g_clu,对边的属性使用"sum"方式合并
g_clu <- simplify(g_clu, edge.attr.comb = "sum")
# 根据节点属性"cat"计算每个组内各个类别("A"、"B"、"C")的数量,分别添加为"A"、"B"、"C"的属性
V(g_clu)$A <- sapply(V(g_clu)$cat, function(x)
sum(x == "A"))
V(g_clu)$B <- sapply(V(g_clu)$cat, function(x)
sum(x == "B"))
V(g_clu)$C <- sapply(V(g_clu)$cat, function(x)
sum(x == "C"))
# 使用layout_with_stress函数计算节点的布局坐标
xy <- layout_with_stress(g_clu)
# 将计算得到的节点布局坐标分别赋值给节点属性"x"和"y"
V(g_clu)$x <- xy[, 1]
V(g_clu)$y <- xy[, 2]
# 使用ggraph函数绘制图形,使用"manual"布局,节点的x和y坐标从属性中获取
ggraph(g_clu, "manual", x = V(g_clu)$x, y = V(g_clu)$y) +
# 添加边的可视化,使用geom_edge_link0函数
geom_edge_link0() +
# 添加饼图散点,表示节点属性"A"、"B"和"C"的比例,填充颜色为白色,饼图比例尺度为3
geom_scatterpie(cols = c("A", "B", "C"),
data = as_data_frame(g_clu, "vertices"),
colour = "white", pie_scale = 3) +
scale_fill_npg() +
coord_fixed() + # 设置坐标系为等比例缩放
theme_graph() +
theme(legend.position = "bottom")