簡體   English   中英

為什么matplotlib使用對數刻度在y中選擇錯誤的范圍?

[英]Why does matplotlib choose the wrong range in y using log scale?

使用matplotlib 1.5.1版和python 2.7.11版時,我注意到我需要在y中手動指定限制,否則僅繪制最大的y值點。 數組的行為方式相同。

如果我刪除第一個要點,我將獲得更多要點,但不是全部。

我不記得以前曾經必須手動設置限制-為什么在這里?

在此處輸入圖片說明

import matplotlib.pyplot as plt

X = [0.997, 2.643, 0.354, 0.075, 1.0, 0.03, 2.39, 0.364, 0.221, 0.437]
Y = [15.487507, 2.320735, 0.085742, 0.303032, 1.0, 0.025435, 4.436435,
     0.025435, 0.000503, 2.320735]

plt.figure()

plt.subplot(1,2,1)
plt.scatter(X, Y)
plt.xscale('log')
plt.yscale('log')


plt.subplot(1,2,2)
plt.scatter(X, Y)
plt.xscale('log')
plt.yscale('log')
plt.ylim(0.5*min(Y), 2.0*max(Y))  # why is this line necessary?
plt.title('added plt.ylim()')

plt.show()

出現問題是因為您首先繪制了散點圖,然后將比例設置為對數,這會導致放大效果。 這消除了問題:

plt.xscale('log')
plt.yscale('log')
plt.scatter(X, Y)

這將產生預期的結果。 (您問題中的第二個子圖。)

看起來matplotlib會在轉換為對數刻度之前創建y軸刻度,然后不根據更改重新創建刻度。 第一個子圖的y軸開始於10e1,而不是10e-3。 因此,在繪制之前更改比例。

plt.xscale('log')
plt.yscale('log')
plt.scatter(X, Y)

我認為,如果在對數刻度旁邊繪制原始刻度,則可能可以找出matplotlib對軸進行部分處理的答案。 在對數標度中,不存在真正的0 -因為lo​​g(0)是未定義的。 因此,坐標必須從大於0的某處開始,這會引起問題。 您的x軸范圍是0到3,而y的范圍是0到16。當轉換為log時, matplotlib正確縮放x軸,但是由於y的倍數為10,所以它會丟失縮放比例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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