簡體   English   中英

最佳擬合線半對數刻度,具有線性y軸和對數x軸

[英]Best fit line semilog scale with linear y-axis and log x-axis

我的問題與關於SO的以下主題密切相關: 使用Matplotlib在半對數刻度上擬合直線

但是,我想在圖表中創建最佳擬合線,其中X軸是對數的,Y軸是線性的。

import matplotlib.pyplot as plt
import numpy as np

plt.scatter(players['AB'], players['Average'], c='black', alpha=0.5)

p = np.polyfit(players['AB'], players['Average'], 1)
plt.plot(players['AB'], p[0] + p[1] * np.log(players['AB']), color='r', linestyle='dashed', alpha=0.7)

plt.xscale('log')
plt.xlim(1, 25000)
plt.ylim(-0.05, 0.60)
plt.xlabel('Number of at-bats (AB)')
plt.ylabel('Batting Average')
plt.show()

這給了我以下內容:

在此輸入圖像描述

我究竟做錯了什么? 謝謝

編輯

  p = np.polyfit(np.log(players['AB']), players['Average'], 1)
  plt.plot(players['AB'], p[0] + p[1] * np.log(players['AB']), color='r', linestyle='dashed', alpha=0.7)

這仍然給我錯誤的最佳配合: 在此輸入圖像描述

我相信你需要這樣做

p = np.polyfit(np.log(players['AB']), players['Average'], 1)
plt.plot(players['AB'], p[0] * np.log(players['AB']) + p[1])

當在x軸半對數空間中繪制時,這將為您提供線性多項式擬合。 這是一個證明這一點的完整例子

import matplotlib.pyplot
import numpy as np

n = 100
np.random.seed(1)
x = np.linspace(1,10000,n)
y = np.zeros(n)
rand = np.random.randn(n)
for ii in range(1,n):
    x[ii] = 10**(float(ii)/10.0)      # Create semi-log linear data
    y[ii] = rand[ii]*10 + float(ii)   # with some noise in the y values

plt.scatter(x,y)
p = np.polyfit(np.log(x), y, 1)
plt.semilogx(x, p[0] * np.log(x) + p[1], 'g--')

plt.xscale('log')

plt.show()

對於生成的樣本數據,這將為您提供

Semilogx線性polyfit

暫無
暫無

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

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