2013-05-14 73 views
2

當沒有指定座標軸限制時,matplotlib選擇默認值作爲好的圓形數字,低於和高於要繪製的列表中的最小值和最大值。Python - matplotlib座標軸限制近似的ticker位置

有時我的數據中有異常值,我不希望它們包含在選擇軸時。我可以檢測到異常值,但我不想實際刪除它們,只是讓它們超出了圖的範圍。我已經嘗試將軸設置爲不包括異常值的列表中的最小值和最大值,但這意味着這些值恰好位於軸上,並且圖的邊界與滾動點不一致。

有沒有辦法指定軸限制應該在一定的範圍內,但讓matplotlib選擇一個合適的點?

例如,下面的代碼產生了很好的曲線圖與自動設定爲(0.140,0.165)的y軸限制:

from matplotlib import pyplot as plt 
plt.plot([0.144490353418, 0.142921640661, 0.144511781706, 0.143587888773, 0.146009766101, 0.147241517391, 0.147224266382, 0.151530932135, 0.158778411784, 0.160337332636]) 
plt.show() 

Plot from the first code example.

在數據和設置引入異常值後手動限制,y軸限制被設置爲略低於0.145並且略高於0.160--幾乎不整齊和整齊。

from matplotlib import pyplot as plt 
plt.plot([0.144490353418, 0.142921640661, 0.144511781706, 0.143587888773, 500000, 0.146009766101, 0.147241517391, 0.147224266382, 0.151530932135, 0.158778411784, 0.160337332636]) 
plt.ylim(0.142921640661, 0.160337332636) 
plt.show() 

Plot from the second code example.

有沒有辦法告訴matplotlib要麼設置限制時忽略離羣值或軸設定爲「高於0.160337332636」下面0.142921640661「和,但讓它決定的適當的位置?我不能簡單地將數字四捨五入,因爲我所有的數據集都發生在不同的數量級上。

回答

1

你可以讓你的data一個masked array

from matplotlib import pyplot as plt 
import numpy as np 

data = [0.144490353418, 0.142921640661, 0.144511781706, 0.143587888773, 500000, 0.146009766101, 0.147241517391, 0.147224266382, 0.151530932135, 0.158778411784, 0.160337332636] 
data = np.ma.array(data, mask=False) 
data.mask = data>0.16 
plt.plot(data) 
plt.show() 

enter image description here

+0

這不是一個理想的解決方案,因爲我想仍然表明存在異常值。我更喜歡它被繪製爲像我的第二個例子,但有更好的軸限制。 – thornate 2013-05-15 04:58:15

+0

另外,現在我看着它,y軸限制還沒有設置正確。理想情況下,他們應該是0.140到0.165。 – thornate 2013-05-15 05:50:15

0

unutbu居然給我說,解決這個問題的想法。這不是最有效的解決方案,所以如果任何人有任何其他的想法,我都耳熟能詳。

編輯:我最初掩蓋像unutbu說的數據,但實際上並沒有設置軸的權利。我必須從數據中刪除異常值。

從數據中去除異常值後,可以繪製剩餘值並獲得y軸限值。然後可以再次繪製具有異常值的數據,但可以從第一個繪圖中設置極限。

from matplotlib import pyplot as plt 

data = [0.144490353418, 0.142921640661, 0.144511781706, 0.143587888773, 500000, 0.146009766101, 0.147241517391, 0.147224266382, 0.151530932135, 0.158778411784, 0.160337332636] 
cleanedData = remove_outliers(data) #Function defined by me elsewhere. 
plt.plot(cleanedData) 

ymin, ymax = plt.ylim() 
plt.clf() 
plt.plot(data) 
plt.ylim(ymin,ymax) 
plt.show()