Суть проблемы заключается в том, что логарифмические шкалы не преобразуют данные , а вместо этого преобразуют, когда данные отображаются в бумажном пространстве .Это означает, что вы не можете взять преобразованные логарифмированные параметры наилучшего соответствия и использовать их на не трансформированных логарифмических данных и правильно построить их.
Вам нужно либо логарифмировать ваши данные, и использовать ихнепосредственно, или вам нужно подумать об отношениях, которые вы фактически смоделировали и (отмените их по мере необходимости).
Подбирая журналы данных, вы подходите к следующему уравнению:
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