Python数据可视化:从零开始教你绘制精美雷达图

安装必要的库

我们需要安装两个核心的 Python 库:matplotlib 用于绘图,numpy 用于高效的数值计算:

bash 复制代码
pip install matplotlib numpy

绘制雷达图的核心逻辑

创建雷达图的过程可以清晰地分解为以下几步,理解了这些步骤,你就能自如地应对各种定制化需求:

  1. 数据准备:确定雷达图需要展示的几个维度(标签),以及每个对象在这些维度上的具体数值。
  2. 创建极坐标画布 :雷达图并非画在常规的直角坐标系上,而是画在一个圆形布局的极坐标系 (Polar Coordinates) 上。
  3. 计算角度:根据维度的数量,将 360 度的圆进行等分,确定每个维度轴线所在的角度。
  4. 闭合图形:为了让雷达图形成一个封闭的多边形,我们需要在数据和角度列表的末尾,额外补充上第一个点的数据和角度。
  5. 绘图与美化:在坐标系上绘制数据点连线、填充颜色、添加网格、标签、图例和标题,使图表变得完整且易于解读。

示例代码

现在,让我们用具体的代码来实现一个"篮球运动员能力对比"的雷达图。

python 复制代码
import numpy as np
import matplotlib.pyplot as plt

def create_table_tennis_radar_chart():
    """
    创建一个专门用于展示乒乓球运动员六维能力数据的雷达图。
    """
    # 解决中文显示问题
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False

    # 1. 定义六个维度的标签
    labels = np.array(['力量', '速度', '技巧', '防守', '发球', '经验'])
    n_labels = len(labels)

    # 2. 准备运动员的数据 (这里是假设的示例数据)
    # "六边形战士"的数据,各项能力非常均衡且顶尖
    hex_warrior_stats = [98, 95, 99, 92, 96, 100]
    # "进攻型选手"的数据,力量和速度突出,防守相对是短板
    attacker_stats = [100, 98, 85, 75, 90, 80]

    # 3. 计算角度 (360度/6)
    angles = np.linspace(0, 2 * np.pi, n_labels, endpoint=False)

    # 4. 闭合图形数据
    hex_warrior_stats_closed = np.concatenate((hex_warrior_stats, [hex_warrior_stats[0]]))
    attacker_stats_closed = np.concatenate((attacker_stats, [attacker_stats[0]]))
    angles_closed = np.concatenate((angles, [angles[0]]))

    # 5. 绘图
    fig, ax = plt.subplots(figsize=(8, 8), subplot_kw=dict(polar=True))

    # 设置坐标轴范围
    ax.set_ylim(0, 105)

    # 绘制"六边形战士"
    ax.plot(angles_closed, hex_warrior_stats_closed, 'o-', color='gold', linewidth=2, label='"六边形战士"')
    ax.fill(angles_closed, hex_warrior_stats_closed, 'gold', alpha=0.25)

    # 绘制"进攻型选手"
    ax.plot(angles_closed, attacker_stats_closed, 'o-', color='red', linewidth=2, label='进攻型选手')
    ax.fill(angles_closed, attacker_stats_closed, 'red', alpha=0.25)

    # 6. 美化图表
    # 设置维度标签
    ax.set_thetagrids(angles * 180 / np.pi, labels, fontsize=14)

    # 设置半径刻度标签
    ax.set_rlabel_position(0)
    ax.set_yticklabels(['', '20', '40', '60', '80', '100'], color="grey", size=10)

    # 添加标题和图例
    plt.title('乒乓球运动员能力对比雷达图', size=22, color='black', y=1.1)
    plt.legend(loc='best', bbox_to_anchor=(1.1, 1.1), fontsize=12)

    # 显示网格
    ax.grid(True, linestyle='--', linewidth=0.5, color='gray')
    
    # 显示图表
    plt.show()

# --- 主程序入口 ---
if __name__ == "__main__":
    create_table_tennis_radar_chart()

解析:

  1. plt.rcParams 设置 :这两行是为了确保 Matplotlib 可以正确显示中文字符。如果你不设置,图表中的中文可能会显示为方框。你需要确保你的系统中有 SimHei (黑体) 或其他中文字体。
  2. np.linspace(0, 2 * np.pi, n_labels, endpoint=False) :这是创建角度数组的核心。它在 0 到 360 度(2*np.pi)之间,生成 n_labels 个等分的角度值。endpoint=False参数是关键,它避免了 360 度和 0 度重合。
  3. np.concatenate():这个 NumPy 函数用于连接数组。我们用它将第一个数据点和第一个角度值拼接到数组的末尾,从而实现图形的闭合。
  4. subplot_kw=dict(polar=True) :在创建子图(ax)时,这个参数告诉 Matplotlib:"我想要的不是普通的直角坐标系,而是一个极坐标系"。
  5. ax.plot()ax.fill()plot 负责画出数据的轮廓线,而 fill 则为这个轮廓区域填充上带有一定透明度(alpha)的颜色,使得重叠区域也能清晰可见。
  6. ax.set_thetagrids() :这个函数专门用于在极坐标上设置角度网格线(也就是我们的维度轴)的位置和显示的标签。它需要将弧度制的 angles 转换为角度制 (angles * 180 / np.pi)。

效果

结语

点个赞,关注我获取更多实用 Python 技术干货!如果觉得有用,记得收藏本文!

相关推荐
崔庆才丨静觅1 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60612 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了2 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅2 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
ValhallaCoder2 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
崔庆才丨静觅2 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
猫头虎3 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
崔庆才丨静觅3 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment3 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅3 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端