Python 在对数图上绘制最佳拟合直线

Python 在对数图上绘制最佳拟合直线,python,numpy,matplotlib,plot,Python,Numpy,Matplotlib,Plot,有一些我在对数图上绘制的数据,现在我想拟合一条穿过这些点的直线。我试过各种各样的方法,但都找不到我想要的。示例代码: import numpy as np import matplotlib.pyplot as plt import random x= np.linspace(1,100,10) y = np.log10(x)+np.log10(np.random.uniform(0,10)) coefficients = np.polyfit(np.log10(x),np.log10(y),

有一些我在对数图上绘制的数据,现在我想拟合一条穿过这些点的直线。我试过各种各样的方法,但都找不到我想要的。示例代码:

import numpy as np
import matplotlib.pyplot as plt
import random

x= np.linspace(1,100,10)
y = np.log10(x)+np.log10(np.random.uniform(0,10))
coefficients = np.polyfit(np.log10(x),np.log10(y),1)
polynomial=np.poly1d(coefficients)
y_fit = polynomial(y)
plt.plot(x,y,'o')
plt.plot(x,y_fit,'-')
plt.yscale('log')
plt.xscale('log')
这给了我一条理想的“直线”,在对数偏移量的基础上加上一个随机数,然后拟合出一个一维多边形。输出为:

所以忽略偏移量,我可以处理,它不是我所需要的,因为它基本上在每个点之间画了一条直线,然后把它们连接起来,而我需要一条穿过它们中间的“最佳拟合线”,这样我就可以测量它的梯度

实现这一目标的最佳方法是什么?

一个问题是

y_fit = polynomial(y)
您必须插入
x
值,而不是
y
,才能获得
y\u拟合

此外,您将
log10(y)
log10(x)
进行拟合,因此要计算线性插值器,您必须插入
log10(x)
,结果将是
y
值的基10对数

这里是脚本的修改版本,后面是它生成的绘图

import numpy as np
import matplotlib.pyplot as plt
import random


x = np.linspace(1,100,10)
y = np.log10(x) + np.log10(np.random.uniform(0,10))

coefficients = np.polyfit(np.log10(x), np.log10(y), 1)
polynomial = np.poly1d(coefficients)
log10_y_fit = polynomial(np.log10(x))  # <-- Changed

plt.plot(x, y, 'o-')
plt.plot(x, 10**log10_y_fit, '*-')     # <-- Changed
plt.yscale('log')
plt.xscale('log')
将numpy导入为np
将matplotlib.pyplot作为plt导入
随机输入
x=np.linspace(1100,10)
y=np.log10(x)+np.log10(np.random.uniform(0,10))
系数=np.多元拟合(np.对数10(x),np.对数10(y),1)
多项式=np.poly1d(系数)

log10_y_fit=多项式(np.log10(x))#这看起来正是我想要的,只是当我尝试它时,它不是这样工作的?这就是我所拥有的,这就是结果。它看起来和你的很像,还是我遗漏了一些明显的东西?谢谢。在该代码中,您可以绘制
10**np.log10(y\u-fit)
。不要使用
y_fit
log10
;只需绘制
10**y_-fit
。嗨,这还没有完全输出您得到的结果-我只是更改了它,所以我没有使用
y_-fit
log10
,而是
10**y_-fit
,我得到了。你的答案对我来说很有意义:将一个多项式拟合到x/y的log10值,然后将其拟合到log10x并绘制它。我不太清楚你为什么要在最后策划它的时候把它拍下来?我也不知道为什么我的输出和你的不一样!