Matplotlib绘制雷达图详解(附带实例)
雷达图也称为极坐标图或蜘蛛网图,主要用于展示多维数据之间的关系并比较它们的差异。
如需创建雷达图,可以使用 pyplot 模块中的 polar() 函数。使用该函数可以直接在默认创建的极坐标系中绘制雷达图。
Axes 对象没有提供 polar() 方法,如需使用该对象创建雷达图,需要先使用 subplot() 函数或 subplots() 函数创建极坐标系,然后才能绘制雷达图。
本节主要介绍使用 pyplot 模块中的 polar() 函数创建雷达图的方法,最后也会介绍使用 subplot() 或 subplots() 函数创建极坐标系,并使用 Axes 对象的 plot() 方法创建雷达图的方法。
极坐标系中的角度通常以弧度表示,为了便于理解,也可以使用角度。无论使用哪种方式,都需要用到 pi 函数,在 Python 标准库中的 math 模块或 NumPy 库中都包含该函数。
下面的代码使用角度的形式表示 45°,通过第一个数字 45,就可以立刻知道该表达式表示的是 45°:
如果使用弧度表示 45°,则需要使用下面的代码:
下面的代码是使用 pyplot 模块中的 polar() 函数在极坐标系中绘制一个点,该点的极角是 45°,极径是 60:

图 1 在雷达图中未显示绘制的点
为了让绘制的点显示出来,可以在 polar() 函数中指定 marker 参数,为点设置一种形状。
下面的代码将绘制的点设置为圆圈:

图 2 将绘制的点设置为圆圈
可以使用 markersize 参数设置点的大小,下面的代码将绘制的点的大小设置为 10 像素,并使用 pyplot 模块中的 ylim() 函数定义极轴的尺寸范围:

图 3 调整点的大小并定义极轴的尺寸范围
下面的代码是在极坐标系中通过绘制 5 个点来创建一个雷达图:

图 4 创建雷达图
5 个点的角度作为 NumPy 中的 array() 函数创建的数组中的元素,一次性将它们转换为弧度。使用 array() 函数的另一个原因是,Python 内置的列表对象无法直接与数字进行数学运算,除非使用列表推导式,但是这会增加编写代码的难度,所以本例使用 NumPy 中的 array() 函数。
下面的代码为前面创建的雷达图设置一种填充色:

图 5 为雷达图设置填充色
下面的代码将雷达图的角度设置为 0°、60°、120°、180°、240° 和 300°:

图 6 更改显示在雷达图四周的角度标签
如果想要使用文本代替角度,则可以为 thetagrids() 函数同时指定 angles 和 labels 两个参数。下面的代码使用 6 个英文字母代替 6 个角度,6 个字母会显示在与 6 个角度对应的位置上,此时的角度只用于定位文本,而不会显示出来:

图 7 将标签中的角度改为文本

图 8 正六边形的雷达图
代码如下:
下面的代码是使用 subplot() 函数创建如下图所示的极坐标系:

图 9 使用subplot函数创建极坐标系
如果使用 subplots() 函数同时创建图形和坐标系,则需要为其指定 subplot_kw 参数,该参数的值是一个字典对象,需要在字典中指定 projection 键,并将该键的值设置为 polar。
下面的代码是使用 subplots() 函数创建相同的极坐标系:
如需创建雷达图,可以使用 pyplot 模块中的 polar() 函数。使用该函数可以直接在默认创建的极坐标系中绘制雷达图。
Axes 对象没有提供 polar() 方法,如需使用该对象创建雷达图,需要先使用 subplot() 函数或 subplots() 函数创建极坐标系,然后才能绘制雷达图。
本节主要介绍使用 pyplot 模块中的 polar() 函数创建雷达图的方法,最后也会介绍使用 subplot() 或 subplots() 函数创建极坐标系,并使用 Axes 对象的 plot() 方法创建雷达图的方法。
在极坐标系中创建一个点
极坐标系中的每个点的坐标由两个值确定:- 极角:点和原点之间的线段与极轴之间的夹角。通常规定角度以逆时针方向为正方向;
- 极径:点到原点的距离。
极坐标系中的角度通常以弧度表示,为了便于理解,也可以使用角度。无论使用哪种方式,都需要用到 pi 函数,在 Python 标准库中的 math 模块或 NumPy 库中都包含该函数。
下面的代码使用角度的形式表示 45°,通过第一个数字 45,就可以立刻知道该表达式表示的是 45°:
import math 45 * math.pi / 180或:
import numpy as np 45 * np.pi / 180
如果使用弧度表示 45°,则需要使用下面的代码:
import math math.pi / 4或:
import numpy as np np.pi / 4使用 pyplot 模块中的 polar() 函数创建雷达图时,该函数的第一个参数 theta 表示极角,第二个参数 r 表示极径。
下面的代码是使用 pyplot 模块中的 polar() 函数在极坐标系中绘制一个点,该点的极角是 45°,极径是 60:
import matplotlib.pyplot as plt import numpy as np theta = 45 * np.pi / 180 r = 60 plt.polar(theta, r) plt.show()运行上面的代码,绘制结果如下图所示,在极坐标中并未显示绘制的点:

图 1 在雷达图中未显示绘制的点
为了让绘制的点显示出来,可以在 polar() 函数中指定 marker 参数,为点设置一种形状。
下面的代码将绘制的点设置为圆圈:
import matplotlib.pyplot as plt import numpy as np theta = 45 * np.pi / 180 r = 60 plt.polar(theta, r, marker='o') plt.show()效果如下图所示:

图 2 将绘制的点设置为圆圈
可以使用 markersize 参数设置点的大小,下面的代码将绘制的点的大小设置为 10 像素,并使用 pyplot 模块中的 ylim() 函数定义极轴的尺寸范围:
import matplotlib.pyplot as plt import numpy as np theta = 45 * np.pi / 180 r = 60 plt.polar(theta, r, marker='o', markersize=10) plt.ylim(0, 100) plt.show()效果如下图所示:

图 3 调整点的大小并定义极轴的尺寸范围
在极坐标系中创建雷达图
在极坐标系中绘制雷达图,实际上就是在极坐标系中绘制多个点,然后使用连接线将这些点连接起来,从而形成一个闭合的形状。由于雷达图是一个闭合的多边形,所以它的起始点和终止点应该是同一个点,它们具有相同的极坐标。下面的代码是在极坐标系中通过绘制 5 个点来创建一个雷达图:
import matplotlib.pyplot as plt import numpy as np theta = np.array([15, 75, 135, 195, 255, 315]) * np.pi / 180 r = [60, 120, 90, 120, 180, 60] plt.polar(theta, r, marker='o', markersize=10) plt.ylim(0, 200) plt.show()效果如下图所示:

图 4 创建雷达图
5 个点的角度作为 NumPy 中的 array() 函数创建的数组中的元素,一次性将它们转换为弧度。使用 array() 函数的另一个原因是,Python 内置的列表对象无法直接与数字进行数学运算,除非使用列表推导式,但是这会增加编写代码的难度,所以本例使用 NumPy 中的 array() 函数。
为雷达图设置填充色
使用 pyplot 模块中的 fill() 函数,可以为雷达图设置填充色。该函数的前两个参数与 polar() 函数相同,为了设置填充色,需要指定 color 关键字参数,并为其设置一个颜色值。下面的代码为前面创建的雷达图设置一种填充色:
import matplotlib.pyplot as plt import numpy as np theta = np.array([15, 75, 135, 195, 255, 315]) * np.pi / 180 r = [60, 120, 90, 120, 180, 60] plt.polar(theta, r, marker='o', markersize=10) plt.ylim(0, 200) plt.fill(theta, r, color='y') plt.show()效果如下图所示:

图 5 为雷达图设置填充色
更改雷达图的刻度标签
在雷达图中显示的角度标签默认为0°、45°、90°、135°、180°、225°、270° 和 315°。如果对角度有特殊要求,可以使用 pyplot 模块中的 thetagrids() 函数,并为其指定 angles 参数来更改角度标签。下面的代码将雷达图的角度设置为 0°、60°、120°、180°、240° 和 300°:
import matplotlib.pyplot as plt import numpy as np theta = np.array([15, 75, 135, 195, 255, 315]) * np.pi / 180 r = [60, 120, 90, 120, 180, 60] angles = range(0, 360, 60) plt.polar(theta, r, marker='o', markersize=10) plt.ylim(0, 200) plt.thetagrids(angles) plt.show()效果如下图所示:

图 6 更改显示在雷达图四周的角度标签
如果想要使用文本代替角度,则可以为 thetagrids() 函数同时指定 angles 和 labels 两个参数。下面的代码使用 6 个英文字母代替 6 个角度,6 个字母会显示在与 6 个角度对应的位置上,此时的角度只用于定位文本,而不会显示出来:
import matplotlib.pyplot as plt import numpy as np theta = np.array([15, 75, 135, 195, 255, 315]) * np.pi / 180 r = [60, 120, 90, 120, 180, 60] angles = range(0, 360, 60) labels = list('ABCDEF') plt.polar(theta, r, marker='o', markersize=10) plt.ylim(0, 200) plt.thetagrids(angles, labels) plt.show()效果如下图所示:

图 7 将标签中的角度改为文本
创建一个正六边形的雷达图
利用前几个小节介绍的知识,可以创建一个如下图所示的正六边形的雷达图:
图 8 正六边形的雷达图
代码如下:
import matplotlib.pyplot as plt import numpy as np ax = plt.subplot(projection='polar') theta = np.array([0, 60, 120, 180, 240, 300, 0]) * np.pi / 180 r = [10, 10, 10, 10, 10, 10, 10] angles = range(0, 360, 60) plt.plot(theta, r, marker='o', markersize=10) plt.ylim(0, 10) plt.fill(theta, r, color='y') plt.thetagrids(angles=angles) plt.show()
使用subplot或subplots函数创建极坐标系
使用 subplot() 函数创建坐标系时,为其指定 projection 参数,并将其值设置为 polar,即可创建极坐标系。下面的代码是使用 subplot() 函数创建如下图所示的极坐标系:
import matplotlib.pyplot as plt ax = plt.subplot(projection='polar') plt.show()

图 9 使用subplot函数创建极坐标系
如果使用 subplots() 函数同时创建图形和坐标系,则需要为其指定 subplot_kw 参数,该参数的值是一个字典对象,需要在字典中指定 projection 键,并将该键的值设置为 polar。
下面的代码是使用 subplots() 函数创建相同的极坐标系:
import matplotlib.pyplot as plt fig, ax = plt.subplots(subplot_kw=dict(projection='polar')) plt.show()
使用Axes对象的plot方法创建雷达图
创建极坐标系后,接下来可以使用 Axes 对象的 plot() 方法创建雷达图,实现方法与使用 polar() 函数没什么区别,唯一区别是使用 plot() 方法替换 polar() 函数,其他代码相同。代码如下:import matplotlib.pyplot as plt import numpy as np ax = plt.subplot(projection='polar') theta = np.array([15, 75, 135, 195, 255, 315]) * np.pi / 180 r = [60, 120, 90, 120, 180, 60] plt.plot(theta, r, marker='o', markersize=10) plt.ylim(0, 200) plt.show()