首页 > 解决方案 > 在列表中绘制具有重复值的平滑曲线

问题描述

我想显示两个列表之间的平滑曲线。
这两个列表的值对应于另一个列表上的不同值。两个列表的值由它们的索引链接。当然,这两个列表的大小是相同的。

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

list1 = [0.9117647058823529, 0.9117647058823529, 0.9090909090909091,..]
list2 = [0.32978723404255317, 0.34065934065934067, 0.3448275862068966,..]

#plt.plot(list1, list2) works well

x = np.array(list1)
y = np.array(list2)

xnew = np.linspace(x.min(), x.max(), 300) 
spl = make_interp_spline(x, y)
y_smooth = spl(xnew)
plt.plot(xnew, y_smooth)

给我ValueError: Expect x to be a 1-D sorted array_like.

当我使用interp1d而不是make_interp_spline我拥有ValueError: Expect x to not have duplicates

如何在不丢失任何点的情况下显示平滑曲线?感谢您的关注。

标签: pythonmatplotlibscipy

解决方案


您可以使用从 0 到 1(或任何其他任意范围)x/y的参数(在下面的代码中调用)参数化由值表示的曲线,计算插值样条的系数,然后使用更精细的间距再次插值曲线param的参数。

param = np.linspace(0, 1, x.size)
spl = make_interp_spline(param, np.c_[x,y], k=2) #(1)
xnew, y_smooth = spl(np.linspace(0, 1, x.size * 100)).T #(2)
plt.plot(xnew, y_smooth)
plt.scatter(x, y, c="r")

备注

  1. 如果可用的数据点多于三个,则可以选择大于 2 的样条度数。默认值为 k=3。

  2. 100 控制新曲线的内插点数量。如果x变大,这里可以使用较小的数字。

结果

样条


推荐阅读