网络分析:如何为ggraph绘制的社交网络节点及社群添加标签?
问题原因
你当前的代码仅给介数中心性betweenness_c大于等于0.06的节点生成了标签,其余节点的node_label被赋值为空字符串,因此只会显示两个符合阈值的核心节点标签。
可调整的实现方案
方案1:降低介数阈值,展示更多高重要性节点标签
调低betweenness_c的判定阈值,平衡标签密度和可读性:
plot <- network %>% filter(community %in% 1:3) %>% mutate(node_size = ifelse(degree_c >= 20,degree_c,0.06)) %>% # 把介数阈值从0.06调低到0.02,可根据实际显示效果灵活调整 mutate(node_label = ifelse(betweenness_c >= 0.02,name,"")) %>% ggraph(layout = "stress") + geom_edge_fan(alpha = 0.05) + geom_node_point(aes(color = as.factor(community),size = node_size)) + geom_node_label(aes(label = node_label),repel = T, # 缩小标签字号容纳更多标签 size = 2.5, show.legend = F, fontface = "bold", label.size = 0.1, segment.colour="slateblue", fill = "#ffffff66", # 调整repel最大迭代次数,避免标签重叠被隐藏 max.overlaps = 50) + coord_fixed() + theme_graph() + theme(legend.position = "none") + labs(title = "network analysis") print(plot)
方案2:按社群展示Top N关键节点标签
如果希望每个社群都均匀展示若干核心节点,可按社群分组后取度数/介数排名靠前的节点显示标签:
plot <- network %>% filter(community %in% 1:3) %>% mutate(node_size = ifelse(degree_c >= 20,degree_c,0.06)) %>% # 按社群分组,取每个社群介数排名前5的节点显示标签,数量可自定义 group_by(community) %>% mutate(node_label = ifelse(rank(-betweenness_c) <=5,name,"")) %>% ungroup() %>% ggraph(layout = "stress") + geom_edge_fan(alpha = 0.05) + geom_node_point(aes(color = as.factor(community),size = node_size)) + geom_node_label(aes(label = node_label),repel = T, size = 2.5, show.legend = F, fontface = "bold", label.size = 0.1, segment.colour="slateblue", fill = "#ffffff66", max.overlaps = 100) + coord_fixed() + theme_graph() + theme(legend.position = "none") + labs(title = "network analysis") print(plot)
可选优化建议
- 如果调整后标签依然拥挤,可导出更大尺寸的高清图,比如用
ggsave("network.png", plot, width = 20, height = 20, dpi = 300)导出,大图能容纳更多不重叠的标签 - 若不需要区分节点重要性直接展示所有节点标签,直接把
node_label赋值为name即可,但节点数量较多时会出现严重重叠,不推荐使用
内容的提问来源于stack exchange,提问作者Qian
相关产品推荐
相关产品推荐

