弦图绘制指南:如何呈现复杂节点的联系与权重

火山方舟关系型数据库智能语音交互

picture.image

背景

弦图以其直观、精美的展示方式受到越来越多人的关注,它不仅能够有效展示两个变量之间的联系,还能同时展现多个变量间的复杂互动,本文将通过Python语言中的pycirclize库,带你深入了解如何绘制弦图,并展示三种不同的数据结构与可视化方式

什么是弦图?

弦图是一种圆形可视化方法,通常用于展示两组对象之间的相互联系和权重,弧线代表对象,弦代表对象之间的连接,弦的宽度表示关系的强弱,弦图直观地反映了多个对象之间的复杂联系,使其非常适用于社交网络、基因表达、系统架构等领域的数据展示

为什么选择 pycirclize?

在 Python 中,有多个库可以用于绘制弦图,例如 matplotlib 和 plotly,然而,pycirclize 是一个专门用于生成环形可视化(弦图、同心环图等)的库,它具备以下优点:

  • 简单直观的 API: 它的接口设计简洁,易于上手,适合快速生成弦图
  • 灵活自定义: 提供丰富的配置项,能够对图形的各个方面进行调整,包括弧、弦、颜色、标签等
  • 高效绘 制: 即使是比较大的数据集,pycirclize 也能够快速生成精美的图形

接下来,我们将通过三种常见的数据表示方式,展示如何使用 pycirclize 库绘制弦图

代码实现

使用矩阵数据绘制弦图


          
from pycirclize import Circos
          
import pandas as pd
          

          
# 定义行名称和列名称
          
row_names = ["S1", "S2", "S3"]  # 行标签,表示 S1, S2, S3
          
col_names = ["E1", "E2", "E3", "E4", "EE5", "E6"]  # 列标签,表示 E1, E2, E3, E4, EE5, E6
          

          
# 定义矩阵数据,表示 S1-S3 与 E1-E6 之间的联系值
          
matrix_data = [
          
    [4, 14, 13, 17, 5, 2],  # S1 与各列的数值
          
    [7, 1, 6, 8, 12, 15],   # S2 与各列的数值
          
    [9, 10, 3, 16, 11, 18]  # S3 与各列的数值
          
]
          

          
# 创建一个 DataFrame,用于表示矩阵,行和列分别是 row_names 和 col_names
          
matrix_df = pd.DataFrame(matrix_data, index=row_names, columns=col_names)
          

          
# 使用 pycirclize 初始化 Circos 图
          
circos = Circos.initialize_from_matrix(
          
    matrix_df,            # 矩阵数据
          
    start=-265,           # 起始角度,-265度
          
    end=95,               # 结束角度,95度
          
    space=5,              # 各个弧之间的间距
          
    r_lim=(93, 100),      # 环的半径范围,93到100
          
    cmap='tab10',         # 使用 'tab10' 颜色映射表
          
    label_kws=dict(
          
        r=94,             # 标签的距离圆心的半径为94
          
        size=12,          # 标签的字体大小为12
          
        color='white'     # 标签颜色为白色
          
    ),
          
    link_kws=dict(
          
        ec='black',       # 弦的边框颜色为黑色
          
        lw=0.5            # 弦的线宽为0.5
          
    )
          
)
          

          
print(matrix_df)
          
# 绘制 Circos 图
          
fig = circos.plotfig()
          
fig.savefig("1.pdf", format='pdf', bbox_inches='tight', dpi=1200)
      

picture.image

picture.image

首先,可以使用一个矩阵数据来展示不同对象之间的关系,这里我们定义了三个对象(S1 到 S3),并且它们与六个其他对象(E1 到 E6)之间存在某些数值联系,最后使用 pycirclize 库,从矩阵数据生成弦图,展示 S1-S3 与 E1-E6 间的联系和权重,并通过设置自定义的图形参数(如起始角度 -265 度,间距 5 度,颜色映射表 tab10 及弦的边框颜色 黑色)来调整图形外观

随机生成大规模矩阵数据的弦图


          
from pycirclize import Circos
          
import pandas as pd
          
import numpy as np
          
import matplotlib.pyplot as plt
          

          
# 生成一个10x10的随机整数矩阵
          
row_names = [f"S{i+1}" for i in range(10)]  # 行名称,S1 到 S10
          
col_names = [f"E{i+1}" for i in range(10)]  # 列名称,E1 到 E10
          
matrix_data = np.random.randint(1, 20, size=(10, 10))  # 生成随机1到20之间的整数
          

          
# 将矩阵数据转换为 DataFrame,以方便后续操作
          
matrix_df = pd.DataFrame(matrix_data, index=row_names, columns=col_names)
          

          
# 初始化 Circos 图
          
circos = Circos.initialize_from_matrix(
          
    matrix_df,             # 传入矩阵数据
          
    space=5,               # 每个单元之间的间隔设为5度
          
    r_lim=(93, 100),       # 设置圆形图的半径范围为93到100
          
    cmap='tab10',          # 使用颜色映射方案 'tab10',可以生成多种颜色
          
    ticks_interval=30,     # 设置刻度间隔,每隔20个单位标记一个刻度
          
    label_kws=dict(
          
        r=94,              # 标签的半径距离为94
          
        size=12,           # 标签的字体大小设为12
          
        color='white'      # 标签的字体颜色为白色
          
    ),
          
    link_kws=dict(
          
        ec='black',        # 弦的边框颜色为黑色
          
        lw=0.5             # 弦的线宽设为0.5
          
    )
          
)
          

          
# 绘制 Circos 图
          
fig = circos.plotfig()
          
print(matrix_df)
          
fig.savefig("2.pdf", format='pdf', bbox_inches='tight', dpi=1200)
      

picture.image

picture.image

使用 pycirclize 库生成一个 10x10 的随机矩阵,并将其可视化为弦图,矩阵中的行和列分别表示 S1-S10 与 E1-E10 的对象,通过自定义参数调整图形的外观,包括弦的颜色映射、环形半径、标签格式、以及弦的边框颜色等,最终生成的弦图展示了各对象之间的关系及其权重,并保存为 PDF 文件

使用 from-to 表格数据绘制弦图


          
from pycirclize.parser import Matrix
          
import pandas as pd
          
from pycirclize import Circos
          

          
# 创建一个包含 'from'、'to' 和 'value' 列的 DataFrame
          
# 该表表示从某个节点到另一个节点的联系及其权重
          
fromto_table_df = pd.DataFrame([
          
    ["A", "B", 10],  # A到B的权重为10
          
    ["A", "C", 5],   # A到C的权重为5
          
    ["A", "D", 15],  # A到D的权重为15
          
    ["A", "E", 20],  # A到E的权重为20
          
    ["A", "F", 3],   # A到F的权重为3
          
    ["B", "A", 3],   # B到A的权重为3
          
    ["B", "G", 15],  # B到G的权重为15
          
    ["F", "D", 13],  # F到D的权重为13
          
    ["F", "E", 13],  # F到E的权重为13
          
    ["E", "A", 20],  # E到A的权重为20
          
    ["E", "D", 6]    # E到D的权重为6
          
], columns=["from", "to", "value"])  # 设置列名为 'from','to','value'
          

          
# 使用 Matrix 类的 parse_fromto_table 方法将 'from-to' 表解析为矩阵
          
matrix = Matrix.parse_fromto_table(fromto_table_df)
          

          
# 使用解析后的矩阵初始化 Circos 图
          
circos = Circos.initialize_from_matrix(
          
    matrix,              # 传入解析后的矩阵
          
    space=3,             # 每个单元之间的间隔设置为3度
          
    cmap="viridis",      # 使用 'viridis' 颜色映射表
          
    ticks_interval=5,    # 设置刻度间隔为5
          
    label_kws=dict(      # 设置标签的关键字参数
          
        size=12,         # 标签字体大小为12
          
        r=110            # 标签距离圆心的半径为110
          
    ),
          
    link_kws=dict(       # 设置弦的样式
          
        direction=1,     # 设定弦的方向
          
        ec="black",      # 弦的边框颜色为黑色
          
        lw=0.5           # 弦的线宽设置为0.5
          
    )
          
)
          

          
# 打印 from-to 表的内容,方便调试或查看
          
print(fromto_table_df.to_string(index=False))
          
# 绘制 Circos 图
          
fig = circos.plotfig()
          
fig.savefig("3.pdf", format='pdf', bbox_inches='tight', dpi=1200)
      

picture.image

picture.image

除了矩阵数据,pycirclize 还支持使用 from-to 格式的数据,使用 pycirclize 库中的 Matrix 类,通过解析 from-to 表格数据,生成一个弦图来可视化不同节点之间的联系及其权重。数据表示了从一个节点(如 A)到另一个节点(如 B)的连接强度(权重),通过设置自定义的参数,包括弦的间隔、颜色映射、标签位置、以及弦的方向与边框样式,最终生成了一张反映节点间关系的图表

往期推荐

SCI图表复现:整合数据分布与相关系数的高级可视化策略

复现顶刊Streamlit部署预测模型APP

树模型系列:如何通过XGBoost提取特征贡献度

不止 SHAP 力图:LIME 实现任意黑盒模型的单样本解释

特征选择:Lasso和Boruta算法的结合应用

从基础到进阶:优化SHAP力图,让样本解读更直观

SCI图表复现:优化SHAP特征贡献图展示更多模型细节

多模型中的特征贡献度比较与可视化图解

从零开始:手把手教你部署顶刊机器学习在线预测APP并解读模型结果

picture.image

picture.image

picture.image

微信号|deep_ML

欢迎添加作者微信进入Python、ChatGPT群

进群请备注Python或AI进入相关群

无需科学上网、同步官网所有功能、使用无限制

如果你对类似于这样的文章感兴趣。

欢迎关注、点赞、转发~

个人观点,仅供参考

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论