如何在 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 个等距样本来绘制曲线。
Syntax:
numpy.linspace(start, stop, num = 50, endpoint = True, retstep = False, dtype = None, axis = 0)
X_Y_Spline = scipy.interpolate.make_interp_spline(x, y)
例子:
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) 参数的值。
Syntax:
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)
cubic_interploation_model=scipy.interpolate.interp1d(x,y,kind=”cubic”)
例子:
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()
输出: