【问题标题】:Plot smooth curve with duplicate values in list在列表中绘制具有重复值的平滑曲线
【发布时间】:2021-09-07 01:48:19
【问题描述】:

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

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

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

【问题讨论】:

    标签: python matplotlib scipy


    【解决方案1】:

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

    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 变大,这里可以使用较小的数字。

    结果

    【讨论】:

    • 非常感谢@werner 的回答和解释!我一直在想它,我想更进一步,是否可以在曲线上强制平滑?我已经编辑了问题。
    • @Tim 在您最初的问题中,您询问了如何在不丢失任何点的情况下绘制曲线。您现在要问的第二件事与此完全不同,因为现在您希望曲线不包含所有点。我建议您保持原始问题不变并提出一个新问题,因为样条曲线可能不是更改问题的最佳方法。通过一个新问题,您还将增加吸引其他有好想法的回答者的机会!
    猜你喜欢
    • 2011-10-26
    • 2021-10-09
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 2013-01-20
    • 2012-06-09
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多