Matplotlib浓缩Y-Ticks有用

时间:2018-10-25 04:15:43

标签: python python-2.7 matplotlib

尝试绘制一组点,其中几个点具有极高的Y值。有没有一种方法可以在图表上显示这些值而又不会丢失其他点的值。例如:

[(1, 10), (2, 33), (3, 100000), (4, 17), (5, 45), (6, 8), (7, 950000)]

我正在绘制一个Y刻度为0-50的图形,然后在50-100000之间绘制相似大小的间隙以显示极端点。

1 个答案:

答案 0 :(得分:1)

不确定matplotlib是否可以自动完成,但是您可以尝试以下几种方法:

  • 使用对数刻度的y轴,即ax.set_yscale('log')。这将在一定程度上减小正则点和离群点之间的差异,但您仍将看到所有常规数据都位于图形底部。

  • 手动将异常值的y值更改为某个非极端值。您以后可以通过使用plt.yticks(actual_data_array, what_to_display_array)

  • 手动设置y轴的显示内容来显示这些点有一定价值。
  • 生成常规(足够高)的图,然后稍后进行图像处理以剪切图像的中间部分。也许有更好的方法,但是一种方法是plt.savefig保存图,matplotlib.image.imread读取图,最后使用plt.imshow(np.concatenate((image_data[:100], image_data[-100:]), 0))

    < / li>

这是我正在谈论的第二种方法的示例:

import numpy as np
import matplotlib.pyplot as plt

a = np.array(((1, 10), (2, 33), (3, 100000), (4, 17), (5, 45), (6, 8), (7, 950000)), 'f')

# scale the array so that matplotlib can plot it "uniformly"
a[a[:,1]>99999,1] = a[a[:,1]>99999,1] / 20000 + 55

plt.plot(*a.T)

# do the displaying trick 
plt.yticks(np.r_[np.linspace(0, 50, 5),
                 np.linspace(100000/20000+55, 950000/20000+55, 5)],
           np.r_[np.linspace(0, 50, 5, dtype='i'),
                 np.linspace(100000, 950000, 5, dtype='i')])

plt.grid()

它看起来像这样:

enter image description here