You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 22:15:02