在对数 - 对数图上使用polyfit使用直线拟合数据集

时间:2017-02-28 14:50:58

标签: python numpy matplotlib plot

我在log-log图上使用matplotlib绘制了这个data。我试图使用polyfitimport 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() 的直线拟合data(低q制度)的前5-6个点。我已经尝试过以前回答过question的解决方案。如果我试试,曲线甚至不会出现在我的情节上。

enter image description here

这是我的代码:

polyfit

修改

如果我在新文件中提取这些点并使用正常的x-y图绘制它。 {{1}}工作正常。

1 个答案:

答案 0 :(得分:0)

  • 你想要在np.log10(x)上不适合x,这就是为什么它在线性比例而不是在对数比例上工作。
  • 你想要log10(y)= m * log(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