python 压缩Y形标记以使其有用

egdjgwm8  于 2023-10-14  发布在  Python
关注(0)|答案(1)|浏览(100)

试图画出一组点,其中几个点有极端的Y值。有没有一种方法可以在图表上展示这些值,而不会丢失其他点的值。举例来说:
[(1, 10), (2, 33), (3, 100000), (4, 17), (5, 45), (6, 8), (7, 950000)]
我想象一个图表与Y刻度0-50,然后类似大小的差距之间的50-100000展示极端点。

bvjxkvbb

bvjxkvbb1#

不确定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))处理图

下面是我刚才提到的第二种方法的一个例子:

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

它看起来像这样:

相关问题