我有一个相关图,我试图在loglog规模中显示值。我试图在相关图上显示最佳拟合线。
以下是我的代码。
进口numpy …
这里问题的关键在于 的 日志比例不会转换数据 强> ,而是他们 的 转换数据在纸空间中显示的位置 强> 。这意味着,您无法获取对数转换的最佳拟合参数,并将其用于非对数转换后的数据,并正确绘制。
您需要对数据进行日志转换,并直接使用它们,或者您需要考虑实际建模的关系(必要时撤消它)。
通过拟合数据的日志,您可以拟合以下等式:
log(y) = m * log(x) + p
使用数学,变成:
y = exp(p) * (x ^ m)
所以你的代码变成:
import numpy from matplotlib import rcParams, pyplot from scipy import stats def loglogplot(seed): rcParams.update({'font.size': 10}) figh, figw = 1.80118*2, 1.80118*2 fig, axes = pyplot.subplots(1, 1, figsize=(figh, figw)) axes.set_xscale('log') axes.set_yscale('log') numpy.random.seed(seed) x = 10 ** numpy.random.uniform(-3, 3, size=1000*4) y = x * 10 ** numpy.random.uniform(-1, 1, size=1000*4) axes.scatter(x, y, color='black', s=10, alpha=0.1) logx = numpy.log(x) # <-- doesn't matter that we use natural log logy = numpy.log(y) # so long as we're consistent slope, intercept, r_value, p_value, std_err = stats.linregress(logx, logy) xhat = numpy.logspace(-4, 4, 1000) yhat = numpy.exp(intercept) * xhat ** slope # exp -> consistency axes.plot(xhat, yhat, color='red', lw=2) axes.set_xlim((10**-4, 10**4)) axes.set_ylim((10**-4, 10**4)) return fig