当前位置:首页>python>Python 语言顶刊绘图复现 —— 弦图(Chord Diagram)可视化

Python 语言顶刊绘图复现 —— 弦图(Chord Diagram)可视化

  • 2026-09-16 21:28:02
Python 语言顶刊绘图复现 —— 弦图(Chord Diagram)可视化

本期分享:

弦图(Chord Diagram)可视化

  弦图(Chord Diagram)是一种用于展示多类别之间相互关系与联系强度的可视化图形,常见于社会科学研究、市场分析、人口迁移研究、交通流动分析、生物信息学等领域。这里,我们用论文图的角度出发理解图并学会复现这幅图。

完整可复制代码Chord_diagram.zip

求点赞

求分享

求喜欢

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

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


复现结果

01 复现结果图

期刊名称:《GIScience & Remote Sensing》(SCI Q1/一区)
论文题目:《Spatiotemporal dynamics and drivers of ecological quality in inner Mongolia: insights from an integrated LGBM-SHAP and GOZH model》

02 全文内容速览

1. 复现分析

2. 完整代码与注释解析

1. 复现分析
1.1 数据要求
  首先,弦图是用来可视化两次时间段不同类别之间流动变化关系,这里我们需要知道转移矩阵这个概念,详细可以参考Python遥感实战:土地利用转移矩阵计算实战(附代码),论文中的思路是将研究区的RSEI分为6类["Worst", "Poor", "Moderate", "Good", "Excellent"],然后分别对研究区2003年与2024年两年间研究区不同类别进行面积统计并将同一个像元两个时间段进行转移分析,得到转移矩阵:
# 这里我们用模拟数据# 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"]
转移矩阵对角线上是两个时间段像元类别未变的区域。
1.2 可视化参数设置
  提供的代码文件中可以自定义所有可视化参数,下面我们将一一讲解:
1.2.1 图像输出设置
CHORD_CONFIG = {    # 1.1 图像输出设置    "dpi": 300,                  # 图像分辨率(论文一般要求300dpi)    "formats": ["png"],          # 输出格式(可扩展为pdf、tiff)    "figsize": (10, 10), }        # 图像尺寸(正方形保证弦图为圆形)
1.2.2 图像字体设置
  这里可以设置字体设置,常见的字体有 Times New Roman 和 Arial:
    # 1.2 字体设置    "font_family_en": "Times New Roman",  # 英文字体(论文常用)    "font_family_zh": "SimSun",           # 中文字体(宋体)    "sector_label_size": 15,              # 扇区标签字体大小    "title_fontsize": 16,                # 标题字体大小    "legend_fontsize": 10,               # 图例字体大小
1.2.3 弦图结构参数
    # 1.3 弦图结构参数    "sector_space": 3,       # 扇区之间的间隔(单位:度)    "inner_radius": 90,      # 外环内半径(0-100)    "outer_radius": 100,     # 外环外半径(0-100)    "label_radius_pos": 110, # 标签显示半径(需大于outer_radius)
1.2.4 弦样式
    # 1.4 弦(连线)样式    "link_alpha": 0.6,             # 弦透明度(越小越透明)    "link_edge_width": 0.2,        # 弦边框宽度    "link_edge_color": "#333333",  # 弦边框颜色(深灰)
1.2.5 分类颜色
    # 1.5 分类颜色(根据数据类别进行添加颜色)    "category_colors": {        "Worst": "#d73027",      # 最差(红色)        "Poor": "#fdae61",       # 较差(橙色)        "Moderate": "#ffffbf",   # 中等(浅黄)        "Good": "#a6d96a",       # 较好(浅绿)        "Excellent": "#1a9850",  # 最优(深绿)    },
1.2.6 图例与标题配置
    # 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. 完整代码与注释解析
# 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() 
注:上述代码已经全部打包,后期会将集成公众号更多数据分析代码和可视化代码进行整理并进一步更新打包!

求点赞

求分享

求喜欢

微信号丨翔的学术日记

商务合作、代码咨询、论文指导请扫描上方微信二维码!

#Python可视化 #弦图 #遥感地学

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

最新文章

随机文章