10

我正在尝试在 matplotlib 中绘制一条线。我正在寻找正确的插值类型。我想要这样的东西

取自 canvasxpress.org/line.html

每条线都被平滑。我尝试了scipy和matplotlib的几种组合,例如

x_new = np.arange(x, x_length, 1)
tck = interpolate.splrep(x, y, s=3)
y_new = interpolate.splev(x_new, tck, der=0)
ax.plot(x_new, y_new, color+lstyle)

但我得到的最好结果是

我的结果

该线代表一个增加的变量..所以它是一个错误的表示。我可以搜索什么?

谢谢

编辑:我正在考虑自己实现一个方法,但我不知道它是否已经完成..伪代码如下

take x and y
calculate spline for each three points 
x[0], x[1], x[2] ... x[1], x[2], x[3] ... and so on
for each y[n] sums every computation done for it and divide by number of 
computations (i.e. y[1] is computed for triplette x[0..2] and x[1..3] so the 
sum is divided by two (average for each point is taken as its value)
4

5 回答 5

12

对于那种类型的图,您需要单调插值。可以使用 scipy.interpolate 中的PchipInterpolator类(您可以通过其较短的别名来引用):pchip

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


# Data to be interpolated.
x = np.arange(10.0)
y = np.array([5.0, 10.0, 20.0, 15.0, 13.0, 22.0, 20.0, 15.0, 12.0, 16.0])

# Create the interpolator.
interp = pchip(x, y)

# Dense x for the smooth curve.
xx = np.linspace(0, 9.0, 101)

# Plot it all.
plt.plot(xx, interp(xx))
plt.plot(x, y, 'bo')
plt.ylim(0, 25)
plt.grid(True)
plt.show()

结果:

在此处输入图像描述

于 2012-10-17T14:32:32.327 回答
1

问题不是显示问题。这是一个插值问题。您正在使用样条函数进行插值。选择正确的插值方法很大程度上取决于您拥有的数据类型。你不能期望有一个插值函数在任何情况下都会表现正确(插值无法知道你的函数正在增加)。

于 2012-10-17T13:23:28.983 回答
1

你应该看看

scipy.interpolate.LSQUnivariateSpline 并使用 k 参数(样条的度数)

或 scipy.interpolate.UnivariateSpline 并使用 k 和 s 参数。

于 2012-10-17T14:06:59.133 回答
1

重要的是要了解插值不仅仅是可视化的线。它是一个数学模型,表示您认为系统的行为方式(生成您测量的数据的系统)。不同类型的插值表示关于系统的不同假设。

所以,如果你知道你的系统是这样一个变量只能增加,你应该拟合一个适当的模型(即使用适当的插值)。查看您的数据,看起来二次多项式或指数函数可能很合适。黄土(局部回归)拟合也将起作用。您可以使用 numpy.polyfit() 等定制函数,也可以使用 scipy.optimize.curve_fit() 进行通用曲线拟合。如果您对系统有进一步的了解,您应该使用它来选择适合的模型。

于 2012-10-17T14:28:12.917 回答
1

我环顾四周。你想要的就叫

单调三次插值,

在这里查看维基百科。你在这里有关于 mathexchange 的讨论,我在 python 中找到了一个实现。让我知道这个是否奏效!

于 2012-10-17T14:31:21.233 回答