簡體   English   中英

Python3 / Matplotlib:嘗試在對數-對數刻度上繪制直線會導致部分彎曲的線

[英]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變大,效果+1n沖走。

要獲得一條直線,可以將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM