[英]Python3/Matplotlib: attempt at drawing straight line on log-log scale results in partially curved line
我試圖繪制一條直線(線性斜率: k = -1.518581016210938
,線性常數(=偏移) b = 6.300735205027388
[這些數字是根據我想繪制最合適的線的數據計算得出的;幾個與繪制對數最佳擬合線有關的答案,但是我也無法使它們起作用]),使用matplotlib將其繪制成對數對數刻度,但是所得的線看起來像是在頂部有一條曲線。 這是我的代碼:
import math
k = -1.518581016210938
b = 6.300735205027388
ext = 1000000
vaakaplot = range(0, 16308+ext)
pystyplot = [10**(k*(math.log(n+1, 10))+b) for n in vaakaplot]
from matplotlib import pyplot as plt
plt.xscale('log')
plt.yscale('log')
plt.plot(vaakaplot, pystyplot, 'b-')
plt.axis([1, 10**6, 1, 10**6])
plt.show()
輸出如下:
誰能告訴我哪里出了問題以及如何解決此問題?
本質上沒有“錯誤”:一幀中的直線不一定是另一幀中的直線。 這是其中一種情況。
直線等效於具有恆定的斜率。 您在此處以“標准”比例解釋的繪圖是點( log(x), log(y) )
。 只要數量很大,這似乎也是對數-對數刻度上的一條直線。 超過x = 15的任意給定點的斜率接近k
。
但是,當x接近0時,切線在分子和分母中都包含+b
項。 那就是拋出您期望值的原因。 y = kx + b
是線性的,但是您的比率log(y) / log(x)
不是。
嘗試在1到10的范圍內打印圖形,您會看到放大效果更好的效果。
您定義的關系在log-log域中不是線性的。 為了使其成為一條直線,我們需要能夠用x代替log(x),用y代替log(y),最后得到一個看起來像y = m * x + b的方程。
在y值的定義中,已將x的每個值加1。 產生的關系如下所示:
如果不先轉換x變量, 就不能替換log(y)-> y和log(x)-> x。 換句話說,它不是log(x)與log(y)的線性關系,因此您不應期望直線。
它看起來僅在圖形左側彎曲的原因是,隨着n
變大,效果+1
被n
沖走。
要獲得一條直線,可以將math.log(n+1, 10)
math.log(n, 10)
math.log(n+1, 10)
更改為math.log(n, 10)
vaakaplot = range(1, 16308+ext)
pystyplot = [10**(k*(math.log(n, 10))+b) for n in vaakaplot]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.