2015-06-01 33 views
0

我試圖用上面的x,y座標繪製一條平滑曲線。不管我得到的圖表超出了我的數據範圍。我的代碼片段在這裏。圖的平滑給出了範圍內的巨大差異

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) 

我碰到下面的曲線輸出plot_example

+2

你應該包括你的'import'報表我們能夠幫助你更好。 'spline'函數來自哪裏? – j08lue

+0

如果您將輸入x和y數據繪製在同一軸上,這也會很有幫助。從外觀上看,您似乎正在進行三次樣條插值而不是平滑(即您的「平滑」輸出通過所有輸入數據點),並且您的插值在x = 0.8附近過調。 –

+0

投票結束:不知道'樣條線'的起源是不可能回答這個問題的。 OP被問及沒有回答。 – tom10

回答

2

我覺得這裏的問題是一個高階的那樣條插值不適合平滑數據。

下面我繪製了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() 

enter image description here

+0

此外PLT ,雖然有一些都順利,經過所有點的方法,並沒有表現出瘋狂最後碰撞。 – tom10

+0

@ tom10,我會非常感興趣的看到一個平滑的插值,更好地處理這種特殊情況。 – cel

+0

由於OP對於一個好的答案的標準並不清楚,而且問題的標題是錯誤地引導讀者「平滑」的目標,所以任何其他答案都不可能被接受或在未來被其他人使用。我真的不想完成寫一個新答案的過程,然後,本質上只是爲了你。如果你想要解決這個問題,也許可以問一個準確的措詞。但是,有很多插值方法在數據中存在差距時並不瘋狂,我只是想爲其他讀者注意。 – tom10