2013-05-14 118 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()