在R语言中如何绘制按门水平空间聚类的微生物组共现网络
按门水平分组的微生物共现网络实现方案
以下是3种最常用的可行实现方案,你可以根据自己的技术栈选择:
方案1:R语言实现(生信领域首选,适配发表级绘图需求)
核心逻辑是先给每个分组分配固定的空间中心,再在组内做小范围力导向布局,既保证分组空间分隔,也能体现组内节点的关联关系:
# 加载依赖包 library(igraph) library(ggraph) library(ggplot2) # 读入示例节点数据 nodes <- data.frame( id = 1:10, label = paste0("species",1:10), group = c(1,1,2,2,2,3,3,3,3,3) ) # 读入示例边数据 edges <- data.frame( from = c(1,1,3,2,2,2,5,5,6,6), to = c(2,3,4,5,4,7,7,8,9,10) ) # 构建网络对象 net <- graph_from_data_frame(edges, directed = FALSE, vertices = nodes) # 自定义每个分组的空间中心坐标,可按需调整位置、间距 group_centers <- list( "1" = c(-5, 0), "2" = c(0, 5), "3" = c(5, 0) ) # 生成带分组约束的布局 lay <- matrix(nrow = vcount(net), ncol = 2) for (g in unique(V(net)$group)) { idx <- which(V(net)$group == g) sub_net <- induced_subgraph(net, idx) # 组内做小范围力导向布局,避免节点过于分散 sub_lay <- layout_with_fr(sub_net, area = 10) # 组内布局叠加分组中心偏移 lay[idx, ] <- t(t(sub_lay) + group_centers[[as.character(g)]]) } # 绘制网络 ggraph(net, layout = lay) + geom_edge_link(color = "gray80", alpha = 0.7) + geom_node_point(aes(color = as.factor(group)), size = 8) + geom_node_text(aes(label = label), size = 3) + theme_void()
方案2:Python实现
适合习惯Python技术栈的用户,用networkx即可快速实现:
import networkx as nx import matplotlib.pyplot as plt import numpy as np # 加载示例节点、边数据 nodes = [ (1, {"label":"species1", "group":1}), (2, {"label":"species2", "group":1}), (3, {"label":"species3", "group":2}), (4, {"label":"species4", "group":2}), (5, {"label":"species5", "group":2}), (6, {"label":"species6", "group":3}), (7, {"label":"species7", "group":3}), (8, {"label":"species8", "group":3}), (9, {"label":"species9", "group":3}), (10, {"label":"species10", "group":3}), ] edges = [(1,2),(1,3),(3,4),(2,5),(2,4),(2,7),(5,7),(5,8),(6,9),(6,10)] # 构建网络对象 G = nx.Graph() G.add_nodes_from(nodes) G.add_edges_from(edges) # 定义每个分组的中心坐标 group_centers = {1: (-5, 0), 2: (0, 5), 3: (5, 0)} pos = {} for g in group_centers.keys(): group_nodes = [n for n, attr in G.nodes(data=True) if attr["group"] == g] subG = G.subgraph(group_nodes) # 生成组内布局 sub_pos = nx.spring_layout(subG, scale=1.5) # 叠加分组偏移 center = group_centers[g] for n in sub_pos: pos[n] = sub_pos[n] + center # 绘图 nx.draw_networkx_edges(G, pos, alpha=0.5, edge_color="gray") node_colors = [G.nodes[n]["group"] for n in G.nodes()] nx.draw_networkx_nodes(G, pos, node_size=500, cmap=plt.cm.tab10, node_color=node_colors) nx.draw_networkx_labels(G, pos, labels={n:G.nodes[n]["label"] for n in G.nodes()}, font_size=8) plt.axis("off") plt.show()
方案3:零代码Cytoscape实现
不需要写代码,适合快速出图调整样式:
- 分别导入节点表、边表到Cytoscape软件中
- 全选所有节点,在布局菜单中选择分组布局,分组字段选择节点表中的group字段
- 手动调整各组的空间位置、节点颜色、边样式后,即可导出高清矢量图
你期望实现的效果参考如下:
内容的提问来源于stack exchange,提问作者Jaz LM
相关产品推荐
相关产品推荐

