📜  如何在 Matplotlib 中绘制平滑曲线?

📅  最后修改于: 2022-05-13 01:55:19.464000             🧑  作者: Mango

如何在 Matplotlib 中绘制平滑曲线?

先决条件: Matplotlib 简介

很多时候,我们从非常分散的数据列表生成线图,这使得图形看起来像连接点的直线或非常密集,导致数据点彼此非常接近,因此图看起来很混乱。

matplotlib.pyplot.plot()函数默认通过用一条直线连接数据中的两个相邻点来生成曲线,因此 matplotlib.pyplot.plot()函数不会为小范围的数据生成平滑的曲线点。

例子:

Python
import numpy as np
import matplotlib.pyplot as plt
 
# Dataset
x = np.array([ 1,  2,  3,  4,  5,  6,  7, 8 ])
y = np.array([ 20, 30, 5, 12, 39, 48, 50, 3 ])
 
# Plotting the Graph
plt.plot(x, y)
plt.title("Curve plotted using the given points")
plt.xlabel("X")
plt.ylabel("Y")
plt.show()


Python
import numpy as np
import numpy as np
from scipy.interpolate import make_interp_spline
import matplotlib.pyplot as plt
 
# Dataset
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
y = np.array([20, 30, 5, 12, 39, 48, 50, 3])
 
X_Y_Spline = make_interp_spline(x, y)
 
# Returns evenly spaced numbers
# over a specified interval.
X_ = np.linspace(x.min(), x.max(), 500)
Y_ = X_Y_Spline(X_)
 
# Plotting the Graph
plt.plot(X_, Y_)
plt.title("Plot Smooth Curve Using the scipy.interpolate.make_interp_spline() Class")
plt.xlabel("X")
plt.ylabel("Y")
plt.show()


Python
import numpy as np
from scipy.interpolate import interp1d
import matplotlib.pyplot as plt
 
# Dataset
x=np.array([1, 2, 3, 4, 5, 6, 7, 8])
y=np.array([20, 30, 5, 12, 39, 48, 50, 3])
 
cubic_interploation_model = interp1d(x, y, kind = "cubic")
 
# Plotting the Graph
X_=np.linspace(x.min(), x.max(), 500)
Y_=cubic_interploation_model(X_)
 
plt.plot(X_, Y_)
plt.title("Plot Smooth Curve Using the scipy.interpolate.interp1d Class")
plt.xlabel("X")
plt.ylabel("Y")
plt.show()


输出:

观察到该图根本不平滑,因为基础数据不遵循平滑线。要绘制平滑曲线,我们首先将样条曲线拟合到曲线上,然后使用曲线找到由无穷小间隙分隔的 x 值的 y 值。我们可以通过绘制那些具有非常小的间隙的点来获得平滑的曲线。

我们可以使用以下方法为该数据集创建平滑曲线:

1. 使用 PyPlot 平滑样条曲线:

它首先使用 scipy.interpolate.make_interp_spline() 确定样条曲线的系数来绘制平滑的样条曲线。我们使用给定的数据点来估计样条曲线的系数,然后我们使用系数来确定非常接近的 x 值的 y 值,以使曲线看起来平滑。在这里,我们将使用 np.linspace() 方法返回均匀间隔的样本,在指定的间隔内计算。可选参数 num 是要在 start 和 stop 范围内生成的样本数。默认值为 50,并且必须为非负数。我们希望此参数具有足够高的值以生成平滑曲线。让我们沿 X 轴在最小值和最大值之间取 500 个等距样本来绘制曲线。

例子:

Python

import numpy as np
import numpy as np
from scipy.interpolate import make_interp_spline
import matplotlib.pyplot as plt
 
# Dataset
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
y = np.array([20, 30, 5, 12, 39, 48, 50, 3])
 
X_Y_Spline = make_interp_spline(x, y)
 
# Returns evenly spaced numbers
# over a specified interval.
X_ = np.linspace(x.min(), x.max(), 500)
Y_ = X_Y_Spline(X_)
 
# Plotting the Graph
plt.plot(X_, Y_)
plt.title("Plot Smooth Curve Using the scipy.interpolate.make_interp_spline() Class")
plt.xlabel("X")
plt.ylabel("Y")
plt.show()

输出:

2. 使用三次插值的样条曲线

它使用 scipy.interpolate.interp1d 类生成三次插值曲线,然后我们使用该曲线来确定平滑曲线的紧密间隔 x 值的 y 值。在这里,我们也将使用 np.linspace() 方法返回均匀间隔的样本,在指定的间隔内计算。让我们沿 X 轴在最小值和最大值之间取 500 个等距样本来绘制曲线。根据您希望线条的弯曲程度,您可以修改第三个 (num) 参数的值。

例子:

Python

import numpy as np
from scipy.interpolate import interp1d
import matplotlib.pyplot as plt
 
# Dataset
x=np.array([1, 2, 3, 4, 5, 6, 7, 8])
y=np.array([20, 30, 5, 12, 39, 48, 50, 3])
 
cubic_interploation_model = interp1d(x, y, kind = "cubic")
 
# Plotting the Graph
X_=np.linspace(x.min(), x.max(), 500)
Y_=cubic_interploation_model(X_)
 
plt.plot(X_, Y_)
plt.title("Plot Smooth Curve Using the scipy.interpolate.interp1d Class")
plt.xlabel("X")
plt.ylabel("Y")
plt.show()

输出: