前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ggraph带你绘制网络饼图

ggraph带你绘制网络饼图

作者头像
R语言数据分析指南
发布2023-08-18 13:56:27
3590
发布2023-08-18 13:56:27
举报

欢迎关注R语言数据分析指南

❝本节来介绍如何使用igraph+scatterpie来绘制网络饼图,下面小编就通过一个案例来进行展示数据为随意构建无实际意义仅作图形展示用,添加了详细的注释希望各位观众老爷能够喜欢 ❞

加载R包

代码语言:javascript
复制
library(tidyverse)
library(igraph)
library(ggraph)
library(graphlayouts)
library(ggforce)
library(scatterpie)
library(ggsci)

案例一

代码语言:javascript
复制
# 设置随机种子,确保结果的可复现性
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")

案例二

代码语言:javascript
复制
# 生成一个包含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")
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-08-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 R语言数据分析指南 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 欢迎关注R语言数据分析指南
  • 加载R包
  • 案例一
  • 案例二
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档