Python matplotlib绘制雷达图:圆形与多边形网格实现详解

咖啡半糖
咖啡半糖
发布时间:2026-10-14 | 2人浏览过
原创

本文详细介绍如何使用Python matplotlib库绘制雷达图。内容涵盖建立极坐标系、使用linspace和concatenate处理数据封闭性,以及通过subplot创建子图。重点讲解如何设置极坐标标签、刻度范围,并对比圆形与多边形网格线的绘制技巧,包括隐藏默认圆形网格及手动绘制多边形网格的方法,适用于多维数据对比分析。

本文主要讲解如何利用matplotlib库在Python中绘制雷达图。

雷达图,亦称网络图、蜘蛛图、星图或蜘蛛网图,本质上是一种不规则多边形。它能够直观地展示同一对象的多维指标,应用范围极为广泛。

一、使用matplotlib绘制圆形雷达图


# coding=utf-8
import numpy as np
import matplotlib.pyplot as plt
 
 
results = [{"大学英语": 87, "高等数学": 79, "体育": 95, "计算机基础": 92, "程序设计": 85},
   {"大学英语": 80, "高等数学": 90, "体育": 91, "计算机基础": 85, "程序设计": 88}]
data_length = len(results[0])
# 将极坐标根据数据长度进行等分
angles = np.linspace(0, 2*np.pi, data_length, endpoint=False)
labels = [key for key in results[0].keys()]
score = [[v for v in result.values()] for result in results]
# 使雷达图数据封闭
score_a = np.concatenate((score[0], [score[0][0]]))
score_b = np.concatenate((score[1], [score[1][0]]))
angles = np.concatenate((angles, [angles[0]]))
labels = np.concatenate((labels, [labels[0]]))
# 设置图形的大小
fig = plt.figure(figsize=(8, 6), dpi=100)
# 新建一个子图
ax = plt.subplot(111, polar=True)
# 绘制雷达图
ax.plot(angles, score_a, color='g')
ax.plot(angles, score_b, color='b')
# 设置雷达图中每一项的标签显示
ax.set_thetagrids(angles*180/np.pi, labels)
# 设置雷达图的0度起始位置
ax.set_theta_zero_location('N')
# 设置雷达图的坐标刻度范围
ax.set_rlim(0, 100)
# 设置雷达图的坐标值显示角度,相对于起始角度的偏移量
ax.set_rlabel_position(270)
ax.set_title("计算机专业大一(上)")
plt.legend(["弓长张", "口天吴"], loc='best')
plt.show()

运行结果如下:

绘制雷达图的核心在于建立极坐标系,建议提前了解相关基础知识。在极坐标系中,通常使用折线图、柱状图等图形,其中折线图最为常见,用于形成不规则的闭合多边形。本文以某高校大一学生的期末考试成绩为例,演示雷达图的具体效果。

linspace()函数用于根据数据维度对极坐标进行等分。该函数接收三个主要参数:起始角度、结束角度以及等分数量。其他参数可根据需求调整,例如endpoint默认为True,表示最后一个数据点位于结束角度。在本例中,角度范围为0至2π,需将endpoint设置为False,否则最后一个数据点会与第一个数据点的角度重叠。

concatenate()函数用于使雷达图数据形成环形封闭结构。该函数的第一个参数是一个包含多个数组的元组,函数将这些数组连接成一个新的数组。为了实现雷达图的封闭,只需将数据的第一个值追加到数据末尾即可。

本文使用plot()函数绘制折线图来生成雷达图。首先通过figure()函数设定图形的大小和清晰度,随后利用subplot()函数创建子图。subplot()函数接收一个长度为3的数字作为参数:第一个数字代表画布的行数,第二个数字代表列数,第三个数字指定当前子图的位置(按从左至右、从上到下的顺序排列),且第三个数字不得超过前两个数字划分出的子图总数。例如,111表示将画布分为一行一列(仅一张子图),且当前子图位于第一张。在subplot()函数中,将polar参数设为True,即可生成极坐标图形。

极坐标系设置完毕后,调用子图对象ax的plot()函数即可绘制出雷达图。若需展示多组数据,只需多次调用plot()函数即可。

使用set_thetagrids()函数可以设置雷达图中各维度的标签及其显示位置。set_theta_zero_location()函数用于指定雷达图0度的起始位置,可传入“N”、“NW”、“W”、“SW”、“S”、“SE”、“E”、“NE”八个方位的缩写。set_rlim()函数用于设定极坐标轴上的刻度范围,而set_rlabel_position()函数则用于设置刻度标签的显示位置,需传入一个相对于雷达图0度的角度值。此外,还可根据需求设置标题、图例等其他属性。

在上述示例中,两位同学的考试成绩被绘制在雷达图上。通过图表可以看出,两人在单科成绩上各有优劣,但整体来看,两位同学的成绩均表现优秀。前例中的网格线为圆形,而折线图连接的两个维度之间是直线相连,因此将网格线替换为多边形形式可能更为合理。

二、使用matplotlib绘制多边形雷达图


import numpy as np
import matplotlib.pyplot as plt
 
 
results = [{"大学英语": 87, "高等数学": 79, "体育": 95, "计算机基础": 92, "程序设计": 85},
   {"大学英语": 80, "高等数学": 90, "体育": 91, "计算机基础": 85, "程序设计": 88}]
data_length = len(results[0])
angles = np.linspace(0, 2*np.pi, data_length, endpoint=False)
labels = [key for key in results[0].keys()]
score = [[v for v in result.values()] for result in results]
score_a = np.concatenate((score[0], [score[0][0]]))
score_b = np.concatenate((score[1], [score[1][0]]))
angles = np.concatenate((angles, [angles[0]]))
labels = np.concatenate((labels, [labels[0]]))
fig = plt.figure(figsize=(10, 6), dpi=100)
fig.suptitle("计算机专业大一(上)")
ax1 = plt.subplot(121, polar=True)
ax2 = plt.subplot(122, polar=True)
ax, data, name = [ax1, ax2], [score_a, score_b], ["弓长张", "口天吴"]
for i in range(2):
 for j in np.arange(0, 100+20, 20):
  ax[i].plot(angles, 6*[j], '-.', lw=0.5, color='black')
 for j in range(5):
  ax[i].plot([angles[j], angles[j]], [0, 100], '-.', lw=0.5, color='black')
 ax[i].plot(angles, data[i], color='b')
 # 隐藏最外圈的圆
 ax[i].spines['polar'].set_visible(False)
 # 隐藏圆形网格线
 ax[i].grid(False)
 for a, b in zip(angles, data[i]):
  ax[i].text(a, b+5, '%.00f' % b, ha='center', va='center', fontsize=12, color='b')
 ax[i].set_thetagrids(angles*180/np.pi, labels)
 ax[i].set_theta_zero_location('N')
 ax[i].set_rlim(0, 100)
 ax[i].set_rlabel_position(0)
 ax[i].set_title(name[i])
plt.show()

运行结果如下:

在极坐标系中,极径值相等的点位于同一个圆上,因此默认绘制的雷达图网格线均为圆形。若需绘制多边形雷达图,则需隐藏圆形网格线,并根据刻度范围手动绘制多边形网格线。

首先,利用plot()函数根据刻度范围绘制多个同心多边形及多个维度方向的极轴,作为雷达图的网格线,从而形成一张“网”。

通过链式调用极坐标的spines['polar'].set_visible()函数并传入参数False,可隐藏极坐标系最外圈的圆形。同时,调用grid()函数并传入参数False,以隐藏极坐标系中的圆形网格线。

完成网格线修改后,即可实现多边形效果。在第二次绘制雷达图时,将两位同学的成绩分别绘制在两张不同的子图中,并使用text()函数为每个维度添加数据标注,最后通过suptitle()函数设置整张图形的总标题。

将两位同学的成绩绘制在同一张雷达图中,便于直接对比两人的整体表现,如谁更全面或更优秀。而分开绘制则有助于分析个人成绩情况,例如是否存在偏科现象。相较于圆形雷达图,多边形雷达图避免了雷达图与网格线的不合理交叉(即雷达图与网格线交叉两次)的问题,因此使用多边形网格线更为合理。

至此,关于如何利用Python matplotlib绘制雷达图的介绍完毕。如需了解更多Python matplotlib绘制雷达图的相关内容,请搜索本站历史文章或继续浏览后续文章。感谢大家的支持!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表