首页 > 编程笔记 > Python笔记 阅读:1

Matplotlib绘制雷达图详解(附带实例)

雷达图也称为极坐标图或蜘蛛网图,主要用于展示多维数据之间的关系并比较它们的差异。

如需创建雷达图,可以使用 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()

相关文章