在 matplotlib 中绘制平滑曲线:信号平滑的 Python 指南

我们将学习如何使用matplotlib和 SciPy 模块构建平滑曲线。

有时,您希望获得平滑的曲线来进行数据可视化,以使绘图看起来更好、更优雅。幸运的是,借助 matplotlib 和SciPy 模块也可以实现同样的目的。

在本教程中,我们学习使用 matplotlib 和 SciPy 在 Python 中绘制平滑曲线。我们首先导入必要的模块,然后准备数据并构建 B 样条曲线。最后,我们使用 matplotlib 可视化平滑曲线。让我们深入了解吧!

推荐阅读:用 Python 创建动画图

设置:导入必要的模块并定义参数

我们首先定义绘图算法所需的模块。我们将把所需的模块导入到我们的程序中。我们要实现目标的模块numpymatplotlib 以及SciPy 需要 numpy 进行数据准备、matplotlib 用于绘制简单绘图以及 SciPy 来帮助绘制平滑曲线的模块。通过编写“import numpy as np”命令,我们可以有效地处理图形维度的输入。

1
2
3
import numpy as np
from scipy.interpolate import make_interp_spline
import matplotlib.pyplot as plt

第一步:准备数据

我们将使用的参数是numpy 数组,因为它们易于处理,使我们能够有效地计算数据。我们将绘制一个正弦波,其中 x 坐标是 x 轴值,y 坐标是 x 的正弦值。我们将对时间序列数据中的噪声进行采样,该数据并不总是遵循平滑线。

1
2
x = np.array([i for i in range(50)])
y = np.array([np.sin(i) for i in x])

第二步:构建 B 样条曲线

为了生成平滑曲线并过滤噪声,我们使用 B 样条核对数据进行插值。该函数曲线代表我们数据的平均值。我们传入 x 和 y 数组作为参数,这会同时返回 x 和 y 系数。

接下来我们需要做的是将系数彼此分开。下面的代码对您执行相同的操作。

1
2
3
B_spline_coeff = make_interp_spline(x, y)
X_Final = np.linspace(x.min(), x.max(), 500)
Y_Final = B_spline_coeff(X_Final)

第三步:可视化平滑曲线

现在最后一步是使用 matplotlib 库以及必要的函数和配置来绘制绘图,以使绘图看起来更好。我们用于绘图的算法采用这些系数来创建数据的优雅视觉表示。使用 matplotlib,我们绘制一条平滑的曲线。尽管原始数据集背后存在嘈杂的变量,但这条平滑的线更准确地表示了我们的数据。

1
2
3
4
5
6
plt.style.use('seaborn')
plt.plot(X_Final,Y_Final,color="red")
plt.title("Smooth Sine Wave")
plt.xlabel("x values")
plt.ylabel("y values")
plt.show()

最终输出图如下所示。

平滑 B 样条曲线

高级绘图:展示多条平滑曲线

让我们使用相同的方法绘制其他平滑曲线,例如沿 x 轴的正弦波,并显示新数据的变化幅度。使用相同的算法,我们可以生成多条曲线来探索更复杂的数据集。下面的代码借助subplotmatplotlib 函数绘制了更多曲线。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 号
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
plt.figure(figsize=(15,15))
 
plt.subplot(3, 3, 1)
x = np.array([i for i in range(30)])
y = np.array([np.tan(i) for i in x])
 
B_spline_coeff = make_interp_spline(x, y)
X_Final = np.linspace(x.min(), x.max(), 500)
Y_Final = B_spline_coeff(X_Final)
 
plt.style.use('seaborn')
plt.plot(X_Final,Y_Final,color="red")
plt.title("Smooth Tan Wave")
plt.xlabel("x values")
plt.ylabel("y values")
 
plt.subplot(3, 3, 2)
x = np.array([i for i in range(30)])
y = np.array([np.exp(i) for i in x])
 
B_spline_coeff = make_interp_spline(x, y)
X_Final = np.linspace(x.min(), x.max(), 500)
Y_Final = B_spline_coeff(X_Final)
 
plt.style.use('seaborn')
plt.plot(X_Final,Y_Final,color="green")
plt.title("Smooth e^x Wave")
plt.xlabel("x values")
plt.ylabel("y values")
 
plt.subplot(3, 3, 3)
x = np.array([i for i in range(10)])
y = np.array([np.sqrt(i) for i in x])
 
B_spline_coeff = make_interp_spline(x, y)
X_Final = np.linspace(x.min(), x.max(), 500)
Y_Final = B_spline_coeff(X_Final)
 
plt.style.use('seaborn')
plt.plot(X_Final,Y_Final,color="pink")
plt.title("Smooth sqrt Wave")
plt.xlabel("x values")
plt.ylabel("y values")
 
plt.subplot(3, 3, 4)
x = np.array([i for i in range(30)])
y = np.array([5**i for i in x])
 
B_spline_coeff = make_interp_spline(x, y)
X_Final = np.linspace(x.min(), x.max(), 500)
Y_Final = B_spline_coeff(X_Final)
 
plt.style.use('seaborn')
plt.plot(X_Final,Y_Final,color="black")
plt.title("Smooth 5^x Wave")
plt.xlabel("x values")
plt.ylabel("y values")
 
plt.subplot(3, 3, 5)
x = np.array([i for i in range(-10,10,1)])
y = np.array([i**2 -5 for i in x])
 
B_spline_coeff = make_interp_spline(x, y)
X_Final = np.linspace(x.min(), x.max(), 500)
Y_Final = B_spline_coeff(X_Final)
 
plt.style.use('seaborn')
plt.plot(X_Final,Y_Final,color="orange")
plt.title("Smooth X^2-5 Wave")
plt.xlabel("x values")
plt.ylabel("y values")
 
plt.subplot(3, 3, 6)
x = np.array([i for i in range(30)])
y = np.array([3**i + i for i in x])
 
B_spline_coeff = make_interp_spline(x, y)
X_Final = np.linspace(x.min(), x.max(), 500)
Y_Final = B_spline_coeff(X_Final)
 
plt.style.use('seaborn')
plt.plot(X_Final,Y_Final,color="magenta")
plt.title("Smooth 3^x+x Wave")
plt.xlabel("x values")
plt.ylabel("y values")
 
plt.show()

代码的输出如下所示。

多重 B 样条曲线

概括

恭喜!今天我们学习了使用 matplotlib 和 SciPy 模块绘制完美平滑的曲线图。应用移动平均值并调整平滑参数,我们可以指定数据的平滑程度。您将如何在下一个数据可视化项目中利用它?