【问题标题】:Smoothing of graph gives a huge difference in the range图形的平滑在范围内产生了巨大的差异
【发布时间】:2015-08-14 16:08:26
【问题描述】:

我正在尝试使用上面的 x,y 坐标绘制平滑曲线。但是,我得到的图表超出了我的数据范围。我的代码的 sn-p 在这里。

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

ylist = [0.36758563074352546, 0.27634194831013914, 0.22261484098939929, 0.10891089108910891, 0.31578947368421051, 0.086956521739130432, 0.27272727272727271, 0.18181818181818182, 0.0, 0.0, 0.92000000000000004, 0.0, 0.10526315789473684, 0.23333333333333334]
xlist = [0.025000000000000001, 0.075000000000000011, 0.125, 0.17500000000000002, 0.22500000000000001, 0.27500000000000002, 0.32500000000000001, 0.375, 0.42500000000000004, 0.47500000000000003, 0.52500000000000002, 0.57500000000000007, 0.625, 0.97500000000000009]

xlist_smooth = np.linspace(xlist.min(), xlist.max(), 100)
ylist_smooth = spline(xlist, ylist, xlist_smooth)
plt.plot(xlist_smooth,ylist_smooth)

我得到以下曲线作为输出

【问题讨论】:

  • 您应该包含您的import 声明,以便我们能够更好地帮助您。 spline 函数从何而来?
  • 如果您将输入的 x 和 y 数据绘制在同一轴上也会很有帮助。从外观上看,您似乎在进行三次样条插值而不是平滑(即,您的“平滑”输出通过所有输入数据点),并且您的插值在 x=0.8 附近过冲。
  • 投票结束:在不知道spline 的来源的情况下,不可能回答这个问题。 OP 被问及没有回答。
  • 这些是我使用的导入语句。将 pandas 作为 pd 导入 numpy 作为 np 导入 matplotlib.pyplot 作为 plt 从 scipy.interpolate 导入样条

标签: python python-2.7 matplotlib scipy


【解决方案1】:

我认为这里的问题是高阶样条插值不适合平滑您的数据。

下面我绘制了 0 到 3 阶的样条插值。您看到的是,一旦您要求导数的连续性(2 阶或更高阶),您就会遇到最后两点的问题。

我想在这里选择样条插值不是一个好的选择。插值假设没有测量误差,并且您的数据中似乎有明显的异常值。

根据您要在此处执行的操作,拟合分段连续样条 (order=1) 可能适合您。否则,您可能必须寻找不同的平滑策略。

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

ylist = [0.36758563074352546, 0.27634194831013914, 0.22261484098939929,
         0.10891089108910891, 0.31578947368421051, 0.086956521739130432, 
         0.27272727272727271, 0.18181818181818182, 0.0, 0.0,
         0.92000000000000004, 0.0, 0.10526315789473684, 0.23333333333333334]
xlist = [0.025000000000000001, 0.075000000000000011, 0.125, 0.17500000000000002,
         0.22500000000000001, 0.27500000000000002, 0.32500000000000001, 0.375,
         0.42500000000000004, 0.47500000000000003, 0.52500000000000002, 
         0.57500000000000007, 0.625, 0.97500000000000009]

xlist_smooth = np.linspace(min(xlist), max(xlist), 100)

fig, axes = plt.subplots(4,1, sharex=True)
for order, ax in enumerate(axes):
    ylist_smooth = spline(xlist, ylist, xlist_smooth, order=order)
    ax.plot(xlist_smooth, ylist_smooth,  label="spline order %s" % order)
    ax.scatter(xlist, ylist, label="knots")
    ax.set_ylim(min(xlist)-1,max(xlist)+1)
    ax.legend()

【讨论】:

  • 不过,也有一些方法既流畅又通透所有要点,而且最后不会出现疯狂的颠簸。
  • @tom10,我很想看到一个能更好地处理这种特殊情况的平滑插值。
  • 由于 OP 不清楚一个好的答案的标准,并且问题的标题将读者误导到“平滑”的目标,因此任何额外的答案都不太可能被接受或成为以后给别人用。我真的不想经历写一个新答案的过程,那么,基本上只是为了你。如果您想解决问题,也许可以问一个措辞准确的类似问题。但是有许多插值方法不会在每次数据出现差距时都变得疯狂,我只是想为其他读者注意。
  • @tom10,是的,我完全理解准备另一个答案可能不值得。但如果您有时间在 cmets 中分享您的想法或替代方案,我将不胜感激!
  • 我回答了一个不同的问题(并且没有我在之前的评论中提到的所有问题),我认为答案也解决了您提出的问题:stackoverflow.com/questions/31221444/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
  • 2017-04-07
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多