2012-09-27 38 views
1

我有一個簡單的問題來擬合對數對數的直線。我的代碼,使用對數對數多項式擬合

data=loadtxt(filename) 
xdata=data[:,0] 
ydata=data[:,1] 
polycoeffs = scipy.polyfit(xdata, ydata, 1) 
yfit = scipy.polyval(polycoeffs, xdata) 
pylab.plot(xdata, ydata, 'k.') 
pylab.plot(xdata, yfit, 'r-') 

現在我需要繪製對數刻度擬合線,所以我只是改變X和Y軸,

ax.set_yscale('log') 
ax.set_xscale('log') 

那麼它的不正確繪製擬合線。那麼,如何改變擬合函數(以對數刻度),以便它可以在對數 - 對數刻度上繪製擬合線?

+0

我沒有看到你的代碼任何問題。你的範圍包括零點?在這種情況下,您不能以對數比例繪製。嘗試修改軸的範圍。 –

回答

2

編輯:

from scipy import polyfit 
data = loadtxt("data.txt") 
xdata,ydata = data[:,0],data[:,1] 
xdata,ydata = zip(*sorted(zip(xdata,ydata))) # sorts the two lists after the xdata  

xd,yd = log10(xdata),log10(ydata) 
polycoef = polyfit(xd, yd, 1) 
yfit = 10**(polycoef[0]*xd+polycoef[1]) 

plt.subplot(211) 
plt.plot(xdata,ydata,'.k',xdata,yfit,'-r') 
plt.subplot(212) 
plt.loglog(xdata,ydata,'.k',xdata,yfit,'-r') 
plt.show() 
+0

是的。我也嘗試過這個選項,但合適的線條沒有什麼不同。仍然存在問題。 –

+0

這可能是因爲你符合線性擬合'polyval(xdata,ydata,1)'。理論擬合如何?它在普通的'plt.plot(...)中看起來還好嗎? –

+0

是的,它的關聯性非常好。如果我在繪圖之前記錄數據(xdata = log10 [data:,0],xdata = log10 [data:,1]),那麼它適合。 –

1

你想

log(y) = k log(x) + q,所以

y = exp(k log(x) + q) = exp(k log(x)) * exp(q) = exp(log(x^k)) * exp(q) = A x^k

,你可以看到一個要求是y(0) = 0

從視圖代碼點,你正密謀僅使用數據的X擬合函數,可能是更好的加點:

xfit = scipy.linspace(min(xdata), max(xdata), 50) 
yfit = scipy.polyval(polycoeffs, xfit) 
ax.plot(xfit, yfit, 'r-') 
+0

如果我的xdata都是負值,那我該如何進行擬合?我嘗試了'symlog',但沒有繪製直線。你知道如何改變symlog的線性擬合函數嗎? –

+0

負值的問題是什麼?問題是如果你相交零 –