簡體   English   中英

在對數-對數圖上使用polyfit將數據集擬合為直線

[英]Fitting a dataset with a straight line using polyfit on a log-log plot

我已經使用matplotlib在對數-對數圖上繪制了這些數據 我正在嘗試使用polyfit用一條直線擬合數據的前5-6點(低q值)。 我已經嘗試過解決此先前回答的問題 如果我嘗試這樣做,曲線甚至不會出現在我的繪圖上。

在此處輸入圖片說明

這是我的代碼:

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()

編輯

如果我將這些點提取到新文件中,並使用普通的xy圖進行繪制。 polyfit工作正常。

  • 您想要適合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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM