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

2025年1月5日 | 阅读 5 分钟

折线图通常由一些分散的数据列表生成,导致图形看起来像连接点的直线,或者数据点非常密集,使得图表显得杂乱无章。

Matplotlib 的 pyplot.plot() 方法默认情况下通过直线连接数据中的两个相邻点来创建曲线,因此对于数据点范围较窄的数据,它不会生成平滑曲线。

示例

程序说明

此 Python 程序利用 NumPy 和 Matplotlib 模块生成了一个基本的折线图。数据集中包含两个 NumPy 数组:'x' 表示 x 轴上的值,'y' 表示 y 轴上的值。然后,程序使用 Matplotlib 创建一条连接 (x, y) 对所指示点的曲线。生成的图表显示了带有“x”和“y”轴标签以及标题“使用给定点绘制的曲线”。通过图形化地表示 x 和 y 值之间的关系,该图表简要概述了数据集及其反映的趋势。

输出

How to Plot a Smooth Curve in Matplotlib

由于底层数据本身并不遵循一条平滑的直线,因此您可以看到绘制的曲线并不平滑。为了创建平滑曲线,我们首先将一条样条曲线拟合到数据上,然后利用这条曲线来确定间隔非常小的 x 值对应的 y 值。绘制这些间隔极小的数据点将得到一条平滑的曲线。

生成平滑曲线的技术

对于此数据集,我们可以使用以下技术来生成平滑曲线:

1. 使用 PyPlot 绘制平滑样条曲线

它使用 scipy.interpolate.make_interp_spline() 函数来确定样条曲线的系数,然后再绘制平滑的样条曲线。为了使曲线看起来平滑,我们首先使用提供的数据点来估计样条曲线的系数。然后,我们使用这些系数来获取非常密集间隔的 x 值的 y 值。在这种情况下,将使用 np. linspace() 函数,该函数生成在给定区间内计算的等间距样本。num 参数是可选的,表示要在 start 和 stop 范围之间生成的样本数量。该值必须是非负的,默认值为 50。

为了生成平滑曲线,我们需要这个参数有一个足够大的值。为了绘制曲线,让我们选择 500 个在最小值和最大值之间的 x 轴上等间距的样本。

语法

示例

程序说明

此 Python 程序利用 scipy.interpolate 模块中的 make_interp_spline 类来创建平滑的曲线图。它通过使用 NumPy、SciPy 和 Matplotlib 库来实现。数据集由两个 NumPy 数组组成:'x' 表示 x 轴上的值,'y' 表示 y 轴上的值。然后,程序利用 make_interp_spline 函数(可以利用提供的数据创建平滑曲线)来构建样条插值。接着,利用 linspace 函数在更精细间隔的 x 值范围内进行插值计算。最后,使用 Matplotlib 显示平滑曲线。生成的图表显示了标记的 x 和 y 轴以及标题“使用 scipy.interpolate.make_interp_spline() 类绘制平滑曲线”。

输出

How to Plot a Smooth Curve in Matplotlib

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

使用 scipy.interpolate. interp1d 类,它创建一条三次插值曲线,然后使用该曲线来计算密集间隔的 x 值的 y 值,从而生成平滑曲线。在这种情况下,同样会使用 np. linspace() 技术,该技术生成在给定区间内计算的等间距样本。为了绘制曲线,我们将从最小值到最大值之间选择 500 个等间距的 x 轴样本。您可以更改第三个参数 (num) 的值来获得所需的曲线平滑度。

语法

示例

程序说明

此 Python 程序采用 scipy.interpolate 模块中的 interp1d 类进行三次插值,以生成平滑曲线图。它通过使用 NumPy、SciPy 和 Matplotlib 库来实现。数据集由两个 NumPy 数组组成:'x' 表示 x 轴上的值,'y' 表示 y 轴上的值。接下来,程序使用 interp1d 函数和“cubic”(三次)作为插值类型,构建一个三次插值模型,使其能够生成通过提供数据点的平滑曲线。然后,使用 linspace 函数在更精细间隔的 x 值范围内测试插值模型。最后,使用 Matplotlib 绘制平滑曲线,并显示带有标题“使用 scipy.interpolate.interp1d 类绘制平滑曲线”的图表。带有 x 和 y 标签。

输出

How to Plot a Smooth Curve in Matplotlib