本期分享:
弦图(Chord Diagram)可视化
完整可复制代码Chord_diagram.zip
求点赞

求分享

求喜欢


点击下方账号名片 关注我们

点击关注上方“翔的学术日记”,选择加"星标"置顶重磅干货,第一时间送达!也可后台留言私信我后续希望更新的内容!
复现结果
01 复现结果图

02 全文内容速览
1. 复现分析
2. 完整代码与注释解析
# 这里我们用模拟数据# 1. 转移矩阵读取 (这里我们随机生成)data = np.array([[30, 10, 5, 2, 1],[8, 25, 10, 3, 2],[5, 10, 30, 8, 3],[2, 4, 8, 20, 6],[1, 2, 3, 5, 15]])# 2. 类别名categories = ["Worst", "Poor", "Moderate", "Good", "Excellent"]
CHORD_CONFIG = {# 1.1 图像输出设置"dpi": 300, # 图像分辨率(论文一般要求300dpi)"formats": ["png"], # 输出格式(可扩展为pdf、tiff)"figsize": (10, 10), } # 图像尺寸(正方形保证弦图为圆形)
# 1.2 字体设置"font_family_en": "Times New Roman", # 英文字体(论文常用)"font_family_zh": "SimSun", # 中文字体(宋体)"sector_label_size": 15, # 扇区标签字体大小"title_fontsize": 16, # 标题字体大小"legend_fontsize": 10, # 图例字体大小
# 1.3 弦图结构参数"sector_space": 3, # 扇区之间的间隔(单位:度)"inner_radius": 90, # 外环内半径(0-100)"outer_radius": 100, # 外环外半径(0-100)"label_radius_pos": 110, # 标签显示半径(需大于outer_radius)

# 1.4 弦(连线)样式"link_alpha": 0.6, # 弦透明度(越小越透明)"link_edge_width": 0.2, # 弦边框宽度"link_edge_color": "#333333", # 弦边框颜色(深灰)
# 1.5 分类颜色(根据数据类别进行添加颜色)"category_colors": {"Worst": "#d73027", # 最差(红色)"Poor": "#fdae61", # 较差(橙色)"Moderate": "#ffffbf", # 中等(浅黄)"Good": "#a6d96a", # 较好(浅绿)"Excellent": "#1a9850", # 最优(深绿)},
# 1.6 图例配置"legend": {"title": "RSEI Level", # 图例标题"loc": "center left", # 图例位置(左中)"bbox_to_anchor": (1.2, 0.5), # 图例锚点(控制偏移)"frameon": False, # 是否显示图例边框"fontsize": 15, # 图例字体大小"title_fontsize": 20, # 图例标题字体大小'handlelength': 1.5, # 图例长度'handleheight': 1.5 # 图例高度},# 1.7 图标题"title": "Transition Matrix 2003-2024"

# 0. 导入库import matplotlib.pyplot as plt # Matplotlib 主绘图库(用于绘图、标题、图例等)import matplotlib.font_manager as fm # 字体管理模块(用于检测系统字体)import matplotlib.patches as mpatches # 用于构建图例中的色块(Patch对象)import seaborn as sns # Seaborn(用于统一图像风格)import numpy as np # 数值计算库(处理矩阵数据)import pandas as pd # 数据结构库(DataFrame用于存储矩阵)from pycirclize import Circos # 核心库:用于绘制弦图(Chord Diagram)# 1. 全局配置(所有参数集中管理)CHORD_CONFIG = {# 1.1 图像输出设置"dpi": 300, # 图像分辨率(论文一般要求300dpi)"formats": ["png"], # 输出格式(可扩展为pdf、tiff)"figsize": (10, 10), # 图像尺寸(正方形保证弦图为圆形)# 1.2 字体设置"font_family_en": "Times New Roman", # 英文字体(论文常用)"font_family_zh": "SimSun", # 中文字体(宋体)"sector_label_size": 15, # 扇区标签字体大小"title_fontsize": 16, # 标题字体大小"legend_fontsize": 10, # 图例字体大小# 1.3 弦图结构参数"sector_space": 3, # 扇区之间的间隔(单位:度)"inner_radius": 90, # 外环内半径(0-100)"outer_radius": 100, # 外环外半径(0-100)"label_radius_pos": 110, # 标签显示半径(需大于outer_radius)# 1.4 弦(连线)样式"link_alpha": 0.6, # 弦透明度(越小越透明)"link_edge_width": 0.2, # 弦边框宽度"link_edge_color": "#333333", # 弦边框颜色(深灰)# 1.5 分类颜色(根据数据类别进行添加颜色)"category_colors": {"Worst": "#d73027", # 最差(红色)"Poor": "#fdae61", # 较差(橙色)"Moderate": "#ffffbf", # 中等(浅黄)"Good": "#a6d96a", # 较好(浅绿)"Excellent": "#1a9850", # 最优(深绿)},# 1.6 图例配置"legend": {"title": "RSEI Level", # 图例标题"loc": "center left", # 图例位置(左中)"bbox_to_anchor": (1.2, 0.5), # 图例锚点(控制偏移)"frameon": False, # 是否显示图例边框"fontsize": 15, # 图例字体大小"title_fontsize": 20, # 图例标题字体大小'handlelength': 1.5, # 图例长度'handleheight': 1.5 # 图例高度},# 1.7 图标题"title": "Transition Matrix 2003-2024"}#-------------------------------------------------------------------------------# 2. 字体环境配置# 获取系统中所有已安装字体名称available_fonts = [f.name for f in fm.fontManager.ttflist]# 从配置中读取目标字体en_font = CHORD_CONFIG["font_family_en"]zh_font = CHORD_CONFIG["font_family_zh"]if en_font not in available_fonts:print(f"Warning: '{en_font}' not found, fallback enabled.")if zh_font not in available_fonts:print(f"Warning: '{zh_font}' not found, Chinese may not display.")# 设置字体回退机制font_fallback = [en_font, zh_font, "Arial", "sans-serif"]# 配置 Matplotlib 全局参数plt.rcParams.update({"font.family": "sans-serif", # 字体类型"font.sans-serif": font_fallback, # 字体候选列表"axes.unicode_minus": False, # 正常显示负号"savefig.dpi": CHORD_CONFIG["dpi"], # 保存分辨率"figure.titlesize": CHORD_CONFIG["title_fontsize"]})# 设置 Seaborn 风格(白底)sns.set_theme(style="white", rc={"font.sans-serif": font_fallback,"axes.unicode_minus": False})print("Environment initialized.") # 提示初始化完成############################# 主程序 ################################### 1. 转移矩阵读取 (这里我们随机生成)data = np.array([[30, 10, 5, 2, 1],[8, 25, 10, 3, 2],[5, 10, 30, 8, 3],[2, 4, 8, 20, 6],[1, 2, 3, 5, 15]])# 2. 类别名categories = ["Worst", "Poor", "Moderate", "Good", "Excellent"]# 3. 将 Numpy 的 array 转换为 DataFramedf = pd.DataFrame(data, index=categories, columns=categories)# 4. 构建颜色映射(保证顺序一致)# 按类别顺序提取颜色(避免字典乱序问题)cmap = CHORD_CONFIG["category_colors"]# 6. 绘制弦图circos = Circos.initialize_from_matrix(df, # 转移矩阵space=CHORD_CONFIG["sector_space"], # 扇区间隔r_lim=(CHORD_CONFIG["inner_radius"], CHORD_CONFIG["outer_radius"]), # 半径范围cmap=cmap, # 分类颜色label_kws=dict(size=CHORD_CONFIG["sector_label_size"], # 标签字体大小r=CHORD_CONFIG["label_radius_pos"] # 标签位置),link_kws=dict(alpha=CHORD_CONFIG["link_alpha"], # 弦透明度lw=CHORD_CONFIG["link_edge_width"], # 边框宽度ec=CHORD_CONFIG["link_edge_color"] # 边框颜色) )fig = circos.plotfig()# 7. 构建图例对象与添加图例legend_handles = [mpatches.Patch(color=CHORD_CONFIG["category_colors"][c], # 颜色label=c # 标签)for c in categories]legend_cfg = CHORD_CONFIG["legend"]plt.legend(handles=legend_handles, # 图例元素title=legend_cfg["title"], # 图例标题loc=legend_cfg["loc"], # 图例位置bbox_to_anchor=legend_cfg["bbox_to_anchor"], # 偏移位置frameon=legend_cfg["frameon"], # 是否显示边框fontsize=legend_cfg["fontsize"], # 字体大小title_fontsize=legend_cfg["title_fontsize"], # 标题字体大小handlelength=legend_cfg['handlelength'], # 图例块长度handleheight=legend_cfg['handleheight'] # 图例块高度)# 8. 添加标题plt.title(CHORD_CONFIG["title"], # 标题文本fontsize=CHORD_CONFIG["title_fontsize"], # 字体大小fontfamily=CHORD_CONFIG["font_family_en"] # 字体)# 9. 显示图像plt.show()
求点赞

求分享

求喜欢




微信号丨翔的学术日记
商务合作、代码咨询、论文指导请扫描上方微信二维码!

点“阅读原文”下载文章源代码