【问题标题】:Python - matplotlib axes limits approximate ticker locationPython - matplotlib 轴限制近似的股票位置
【发布时间】:2013-05-14 12:53:48
【问题描述】:

当没有指定坐标轴限制时,matplotlib 选择默认值作为漂亮的整数,低于和高于要绘制的列表中的最小值和最大值。

有时我的数据中有异常值,我不希望在选择轴时包含它们。我可以检测到异常值,但我不想实际删除它们,只是让它们超出绘图区域。我尝试将轴设置为列表中不包括异常值的最小值和最大值,但这意味着这些值正好位于轴上,并且绘图的边界与股票点不对齐。

有没有办法指定轴限制应该在某个范围内,但让 matplotlib 选择一个合适的点?

例如,以下代码生成了一个漂亮的图,其中 y 轴范围自动设置为 (0.140,0.165):

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()

在数据中引入异常值并手动设置限制后,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()

有没有办法告诉 matplotlib 在设置限制时忽略异常值,或者将轴设置为“低于 0.142921640661”和“高于 0.160337332636”,但让它决定一个合适的位置?我不能简单地将数字上下四舍五入,因为我所有的数据集都出现在不同的数量级上。

【问题讨论】:

    标签: python matplotlib axes limits


    【解决方案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()
    

    【讨论】:

    • 这不是一个理想的解决方案,因为我仍然想证明存在异常值。我希望它像我的第二个示例一样绘制,但具有更好的轴限制。
    • 另外,现在我看了一下,y 轴范围没有设置正确。理想情况下,它们应该是 0.140 到 0.165。
    【解决方案2】:

    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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      相关资源
      最近更新 更多