侧边栏壁纸
  • 累计撰写 21 篇文章
  • 累计创建 14 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

networks 处理excel

Administrator
2024-01-28 / 0 评论 / 0 点赞 / 8 阅读 / 7509 字

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')
​

0

评论区