2017-02-28 81 views
0

我在對數 - 對數圖上使用matplotlib繪製了這個data。我試圖用polyfit以直線符合我的data(低q狀態)的前5-6點。我已經嘗試過這個解決方案,以前回答question。如果我嘗試,曲線甚至不會出現在我的情節中。在對數 - 對數圖上使用polyfit擬合數據集

enter image description here

這裏是我的代碼:

import matplotlib.pyplot as plt 
import numpy as np 
from scipy import * 

with open("data.dat", "r") as f: 
x = [] 
y = [] 
    for line in f: 
     if not line.strip() or line.startswith('@') or line.startswith('#'): 
      continue 
     row = line.split() 
     x.append(float(row[0])) 
     y.append(float(row[1])) 

x = np.asarray(x) 
y = np.asarray(y) 

plt.loglog(x, y, basex=10,basey=10, linestyle="none",marker=".",color='b',label="data") 

x_fit= x[:5] 
y_fit= 1/x_fit**4/10**6 

plt.plot(x_fit,y_fit, label='should be like this',color='r') 
m,b = np.polyfit(x_fit, y_fit, 1) 
plt.plot(x_fit, m*x_fit+ b, linestyle='--', label='polyfit', color='g') 

plt.legend() 
plt.ylabel('Spectra ($\AA^2$)') 
plt.xlabel('q ($\AA^{-1}$)') 
plt.grid() 
plt.show() 

編輯

如果我提取新文件的點,然後用常規的X-Y情節繪製。 polyfit工作正常。

回答

0
  • 你想在np.log10(x)上適合不在x上,這就是爲什麼它在線性標尺上工作而不是在對數標尺上。要
  • 日誌10(Y)= M *日誌(X)+ B

    m,b = np.polyfit(np.log10(x[:5]), np.log10(y[:5]), 1) 
    
  • 並根據自己的紅色曲線(y_fit = 1/x_fit ** 4/10 ** 6),則可以手工找到:

    m = -4, b = -6