Python数据可视化之从绘制精美雷达图的新手指南

Written by

in

文章目录
  • 我们需要安装两个核心的 Python 库:matplotlib 用于绘图,numpy 用于高效的数值计算: pip install matplotlib numpy
  • 创建雷达图的过程可以清晰地分解为以下几步,理解了这些步骤,你就能自如地应对各种定制化需求: 数据准备:确定雷达图需要展示的几个维度(标签),以及每个对象在这些维度上的具体数值。 创建极坐标画布:雷达图并非画在常规的直角坐标系上,而是画在一个圆形布局的极坐标系 (Polar Coordinates) 上。 计算角度:根据维度的数量,将 360 度的圆进行等分,确定每个维度轴线所在的角度。 闭合图形:为了让雷达图形成一个封闭的多边形,我们需要在数据和角度列表的末尾,额外补充上第一个点的数据和角度。 绘图与美化:在坐标系上绘制数据点连线、填充颜色、添加网格、标签、图例和标题,使图表变得完整且易于解读。
  • 现在,让我们用具体的代码来实现一个“篮球运动员能力对比”的雷达图。 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() 解析: plt.rcParams 设置:这两行是为了确保 Matplotlib 可以正确显示中文字符。如果你不设置,图表中的中文可能会显示为方框。你需要确保你的系统中有 SimHei (黑体) 或其他中文字体。 np.linspace(0, 2 * np.pi, n_labels, endpoint=False):这是创建角度数组的核心。它在 0 到 360 度(2*np.pi)之间,生成 n_labels 个等分的角度值。endpoint=False参数是关键,它避免了 360 度和 0 度重合。 np.concatenate():这个 NumPy 函数用于连接数组。我们用它将第一个数据点和第一个角度值拼接到数组的末尾,从而实现图形的闭合。 subplot_kw=dict(polar=True):在创建子图(ax)时,这个参数告诉 Matplotlib:“我想要的不是普通的直角坐标系,而是一个极坐标系”。 ax.plot() 和 ax.fill():plot 负责画出数据的轮廓线,而 fill 则为这个轮廓区域填充上带有一定透明度(alpha)的颜色,使得重叠区域也能清晰可见。 ax.set_thetagrids():这个函数专门用于在极坐标上设置角度网格线(也就是我们的维度轴)的位置和显示的标签。它需要将弧度制的 angles 转换为角度制 (angles * 180 / np.pi)。
  • 到此这篇关于Python数据可视化之从绘制精美雷达图的新手指南的文章就介绍到这了,更多相关Python绘制雷达图内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: Python matplotlib实战之雷达图绘制 如何用python绘制雷达图 python绘制雷达图实例讲解 如何利用Python matplotlib绘制雷达图 python使用matplotlib绘制雷达图 PYTHON绘制雷达图代码实例 Python中pygal绘制雷达图代码分享 python批量制作雷达图的实现方法
  • 目录
    • 安装必要的库
    • 绘制雷达图的核心逻辑
    • 示例代码
    • 效果

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

    pip install matplotlib numpy
    

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

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

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

    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()
    
    

    解析:

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

    到此这篇关于Python数据可视化之从绘制精美雷达图的新手指南的文章就介绍到这了,更多相关Python绘制雷达图内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

    您可能感兴趣的文章:

    • Python matplotlib实战之雷达图绘制
    • 如何用python绘制雷达图
    • python绘制雷达图实例讲解
    • 如何利用Python matplotlib绘制雷达图
    • python使用matplotlib绘制雷达图
    • PYTHON绘制雷达图代码实例
    • Python中pygal绘制雷达图代码分享
    • python批量制作雷达图的实现方法

    站内搜索