带有线性Y轴和对数X轴的半对数比例尺上的最佳拟合直线。

3
我的问题与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()

这给了我以下结果:

enter image description here

我做错了什么?谢谢。

编辑

  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)

这仍然给我的最佳匹配不正确: enter image description here

你需要在对数空间中进行多项式拟合。 - Jody Klymak
我尝试了你的修改,但仍然得到了错误的最佳匹配。 - HJA24
有趣的是,在打数和击球率之间存在正相关性,但当你考虑到只有那些起始击球率良好的人才会有成千上万次击球机会时,这种相关性就不那么有趣了。 - Dodge
1个回答

1

我相信你需要做

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 as plt
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 linear polyfit


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接