我们将学习如何使用matplotlib和 SciPy 模块构建平滑曲线。
有时,您希望获得平滑的曲线来进行数据可视化,以使绘图看起来更好、更优雅。幸运的是,借助 matplotlib 和SciPy 模块也可以实现同样的目的。
在本教程中,我们学习使用 matplotlib 和 SciPy 在 Python 中绘制平滑曲线。我们首先导入必要的模块,然后准备数据并构建 B 样条曲线。最后,我们使用 matplotlib 可视化平滑曲线。让我们深入了解吧!
推荐阅读:用 Python 创建动画图
设置:导入必要的模块并定义参数
我们首先定义绘图算法所需的模块。我们将把所需的模块导入到我们的程序中。我们要实现目标的模块numpy
,matplotlib
以及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() |
最终输出图如下所示。
高级绘图:展示多条平滑曲线
让我们使用相同的方法绘制其他平滑曲线,例如沿 x 轴的正弦波,并显示新数据的变化幅度。使用相同的算法,我们可以生成多条曲线来探索更复杂的数据集。下面的代码借助subplot
matplotlib 函数绘制了更多曲线。
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() |
代码的输出如下所示。
概括
恭喜!今天我们学习了使用 matplotlib 和 SciPy 模块绘制完美平滑的曲线图。应用移动平均值并调整平滑参数,我们可以指定数据的平滑程度。您将如何在下一个数据可视化项目中利用它?