networkx
写在前面:最近在做相同样本间不同属性之间的相关性分析并绘制成网络图,在这保存一下
v0.1
导包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import networkx as nx
from scipy.stats import spearmanr
from pylab import show文件读取
# 读取微生物和代谢物表
excel1_path = 'genus.diff.heatmap.6.7.xlsx'
excel2_path = 'group2-vs-group1.xlsx'
df_microbes = pd.read_excel(excel1_path, index_col=0)
df_metabolites = pd.read_excel(excel2_path, index_col=0)计算相关性
通过斯皮尔曼相关性算法构建权重链接
# 初始化关联网络图
G = nx.Graph()
# 计算Spearman相关性系数和p-value,并添加符合条件的边到网络图中
#p-value 为两表之间相关的显著性 这里设置为0.05,rho为基于p值为0.05的基础上计算出的相关系数
for microbe in df_microbes.index:
for metabolite in df_metabolites.index:
rho, p_value = spearmanr(df_microbes.loc[microbe], df_metabolites.loc[metabolite])
if p_value <= 0.05:
G.add_edge(microbe, metabolite, weight=rho, color='red' if rho > 0 else 'green')
画图code
初步画图
# 绘制关联网络图
# spring_layout选择网络图的布局方式
pos = nx.spring_layout(G, seed=42)
edges = G.edges()
weights = [G[u][v]['weight'] for u, v in edges]
colors = [G[u][v]['color'] for u, v in edges]
nx.draw(G,pos, with_labels= True)这只是简单的展示了一个图,节点和边无颜色权重,只有标签值,不符合我们的预期
v0.2
draw()
这里详细介绍下nx.draw()的用法:
G:指定展示的图with_label: 节点是否带标签pos:节点布局形式, 具体包括一下几种:circular_layout:节点在一个圆环上均匀分布random_layout:节点随机分布shell_layout:节点在同心圆上分布spring_layout:用Fruchterman-Reingold算法排列节点(样子类似多中心放射状)spectral_layout:根据图的拉普拉斯特征向量排列节点
node_size: 指定节点的尺寸大小(默认是300)node_color: 指定节点的颜色 (默认是红色,可以用字符串简单标识颜色,例如'r'为红色,'b'为绿色等)node_shape: 节点的形状(默认是圆形,用字符串'o'标识)alpha: 透明度 (默认是1.0,不透明,0为完全透明)width: 边的宽度 (默认为1.0)edge_color: 边的颜色(默认为黑色)style: 边的样式(默认为实现,可选: solid|dashed|dotted,dashdot)with_labels: 节点是否带标签(默认为True)font_size: 节点标签字体大小 (默认为12)font_color: 节点标签字体颜色(默认为黑色)
画图code
计算完相关性之后,发现有两个节点没有用到,对节点进行筛选
# 获取图中所有节点的列表
all_nodes = list(G.nodes())
# 获取微生物和代谢物的索引列表
microbes_nodes = df_microbes.index.tolist()
metabolites_nodes = df_metabolites.index.tolist()
# 保留在图中的微生物和代谢物节点
selected_microbes_nodes = list(set(all_nodes).intersection(microbes_nodes))
selected_metabolites_nodes = list(set(all_nodes).intersection(metabolites_nodes))
# 绘制节点颜色
node_colors =[]
for node in selected_microbes_nodes:
node_colors.append('red')
for node in selected_metabolites_nodes:
node_colors.append('blue')
nx.set_node_attributes(G, dict(zip(G.nodes(), node_colors)), 'color')
# 选择网络图的布局方式
pos = nx.spring_layout(G, seed=42)
#提取之前赋予边的颜色及权重
edges = G.edges()
weights = [G[u][v]['weight'] for u, v in edges]
colors = [G[u][v]['color'] for u, v in edges]
# 绘制关联网络图
nx.draw(G,pos,with_labels= True, node_color = node_colors,
edge_color = colors,width = weights,font_size = 3,
node_size = 120)
plt.title('Microbe-Metabolite Correlation Network')
plt.show()在上面的代码中,我们首先创建一个空的
node_colors列表来存储节点的颜色。然后,我们遍历每个节点,根据其值选择相应的颜色,并将其添加到node_colors列表中。最后,我们使用nx.set_node_attributes方法将节点的颜色属性设置为新创建的颜色列表。
v0.3
rho的值为[-1,1], 同时rho直接关联图边的粗细,所以为了方便演示,我们修改
rho = round(rho,2)*5
计算相关性
通过斯皮尔曼相关性算法构建权重链接
# 初始化关联网络图
G = nx.Graph()
# 计算Spearman相关性系数和p-value,并添加符合条件的边到网络图中
#p-value 为两表之间相关的显著性 这里设置为0.05,rho为基于p值为0.05的基础上计算出的相关系数
for microbe in df_microbes.index:
for metabolite in df_metabolites.index:
rho, p_value = spearmanr(df_microbes.loc[microbe], df_metabolites.loc[metabolite])
rho = round(rho,2)*5
if p_value <= 0.05:
G.add_edge(microbe, metabolite, weight=rho, color='red' if rho > 0 else 'green')
评论区