当前位置:首页>python>Python绘制多分组雷达图(附数据和代码)

Python绘制多分组雷达图(附数据和代码)

  • 2026-10-11 07:56:01
Python绘制多分组雷达图(附数据和代码)

©[悠悠智汇笔记] 版权所有

🙏请尊重劳动成果,守护每一份劳动心血;⚖️未经授权,不得以为任何方式转载、摘编或抄袭。🔄转载合作请后台联系授权,侵权必究。

本期分享多个雷达图绘制在一张图上。该图利用极坐标展示多组数据的多维指标,直观呈现各组的优劣势与均衡性,常用于直观呈现各样本在多个指标上的综合特征与差异,如对比产品性能、评估员工能力或比较不同样本的基因表达水平或微生物丰度。

01

环境配置

定义颜色映射字典,并编写了一个函数来自动寻找系统中的中文字体,确保图表中文不乱码。
import matplotlib.pyplot as pltimport matplotlib.font_manager as fm  # 字体管理模块import pandas as pdimport numpy as npfrom pathlib import Path# 定义颜色映射,为不同组别分配特定颜色COLOR_MAP = {    'A': '#1f77b4', 'B': '#ff7f0e', 'C': '#2ca02c',     'D': '#d62728', 'E': '#9467bd', 'F': '#8c564b',    'G': '#e377c2', 'H': '#7f7f7f'}def set_fonts():    """    设置中英文字体(自动适应不同系统环境)    返回:中文字体属性对象(如失败则返回None)    """    # 1. 设置英文字体为 Times New Roman    try:        plt.rcParams['font.family'] = 'Times New Roman'    except:        plt.rcParams['font.family'] = 'serif'        print("注意:Times New Roman不可用,已使用默认衬线字体")    # 2. 尝试寻找中文字体(Windows系统路径、本地文件或系统字体列表)    try:        win_font = Path('C:/Windows/Fonts/simhei.ttf')        if win_font.exists():            print("检测到Windows系统黑体字体")            return fm.FontProperties(fname=str(win_font))        local_font = Path(__file__).parent / 'simhei.ttf'        if local_font.exists():            print("检测到本地黑体字体文件")            return fm.FontProperties(fname=str(local_font))        print("正在搜索系统中可用的中文字体...")        for font in fm.fontManager.ttflist:            if 'hei' in font.name.lower() or 'zen' in font.name.lower():                print(f"找到中文字体: {font.name}")                plt.rcParams['font.sans-serif'] = [font.name]                return fm.FontProperties(fname=font.fname)    except Exception as e:        print(f"字体设置过程中发生错误: {str(e)}")    print("警告: 未找到合适的中文字体,将仅显示英文")    return None

02

数据加载与画布初始化

读取本地数据文件,并创建一个包含8个子图(2行4列)的极坐标画布。

if __name__ == "__main__":    # 3. 初始化字体设置,获取中文字体对象    print("\n=== 正在初始化字体设置 ===")    cn_font = set_fonts()    # 4. 加载数据文件,处理文件不存在或读取错误的情况    print("\n=== 正在加载数据 ===")    data_file = 'radar_data.csv'    try:        df = pd.read_csv(data_file, index_col=0)        if len(df) < 8:            print(f"注意:数据只有{len(df)}组,将只绘制{len(df)}个雷达图")        elif len(df) > 8:            print(f"注意:数据有{len(df)}组,将只绘制前8组数据")    except FileNotFoundError:        print(f"错误:未找到数据文件 '{data_file}'")        exit()    except Exception as e:        print(f"数据加载失败: {str(e)}")        exit()    # 5. 创建画布,设置2行4列的子图布局,并开启极坐标模式    print("\n=== 正在创建画布 ===")    fig, axes = plt.subplots(2, 4, figsize=(10, 7), subplot_kw={'polar': True})

03

核心绘图

遍历每一个子图,计算极坐标角度,绘制填充区域和边界线,并设置刻度、标签和标题样式。

# 6. 开始遍历8个子图进行绘制    print("\n=== 开始绘制雷达图 ===")    for i, ax in enumerate(axes.flat):        # 处理数据不足8组的情况,关闭多余子图        if i >= len(df):            print(f"子图 {i + 1} 无数据,已禁用")            ax.axis('off')            continue        # 获取当前组的数据并计算闭合的角度和数值        group_name = df.index[i]        values = df.iloc[i].values        num_vars = len(values)        angles = np.linspace(0, 2 * np.pi, num_vars, endpoint=False)        closed_angles = np.concatenate((angles, [angles[0]]))        closed_values = np.concatenate((values, [values[0]]))        # 获取对应颜色并绘制填充区域与边界线        color = COLOR_MAP[group_name]        ax.fill(angles, values, color=color, alpha=0.25)        ax.plot(closed_angles, closed_values, color=color, linewidth=2)        # 设置极坐标参数:0度在顶部,顺时针排列        ax.set_theta_offset(np.pi / 2)        ax.set_theta_direction(-1)        # 设置变量名称标签(X轴)和半径刻度标签(Y轴)        ax.set_xticks(angles)        ax.set_xticklabels(df.columns, fontsize=14, color='#333333')        ax.set_rlabel_position(30)        ax.set_yticks([10, 20, 30])        plt.ylim(0, 40)        ax.tick_params(axis='y', labelsize=12, colors='grey')        # 设置极坐标边框样式(浅灰色)        ax.spines['polar'].set_visible(True)        ax.spines['polar'].set_color('#c1c1c1')        ax.spines['polar'].set_linewidth(1)        # 根据行数动态调整标题间距,并设置标题        title = f"组别 {group_name}" if cn_font else f"Group {group_name}"        title_pad = 20 if i < 4 else 30        if cn_font:            ax.set_title(title, fontproperties=cn_font, pad=title_pad, color=color, fontsize=16)        else:            ax.set_title(title, pad=title_pad)        print(f"已绘制 {title}")

04

输出与保存

调整子图之间的间距,将绘制好的图表保存为高分辨率的PNG图片。
# 7. 调整布局并保存图表为PNG文件    print("\n=== 保存输出文件 ===")    output_file = 'radar_chart.png'    plt.subplots_adjust(hspace=0.5)    plt.tight_layout()    plt.savefig(output_file, dpi=300, bbox_inches='tight')    # 显示最终图表窗口    print("\n=== 显示图表 ===")    plt.show()

🌿 今日的分享就到这里啦~如果这些内容有为你带来帮助,欢迎轻点右下角的【👍赞】和【👀在看】,也欢迎分享给更多需要的人,感恩~

THE

END

数据和代码怎么获取?

点击关注后,后台回复关键词:2026_map_019可直接获取完整的示例数据和代码

如有帮助,您的点赞、评论、转发是我持续创作的动力~

猜您喜欢
往期精选▼

1. Python绘制分组折线+柱状图+蜂群图(附数据和代码)

2. Python绘制双层聚类网络关系图(附数据和代码)

3. Python绘制SHAP+蜂巢图(附数据和代

4. Python绘制嵌套极坐标图之径向柱状图+箱线图(附数

#数据可视化#科研绘图 #雷达图 #Python #Matplotlib

最新文章

随机文章