尝试绘制一组点,其中几个点具有极高的Y值。有没有一种方法可以在图表上显示这些值而又不会丢失其他点的值。例如:
[(1, 10), (2, 33), (3, 100000), (4, 17), (5, 45), (6, 8), (7, 950000)]
我正在绘制一个Y刻度为0-50的图形,然后在50-100000之间绘制相似大小的间隙以显示极端点。
答案 0 :(得分:1)
不确定matplotlib
是否可以自动完成,但是您可以尝试以下几种方法:
使用对数刻度的y轴,即ax.set_yscale('log')
。这将在一定程度上减小正则点和离群点之间的差异,但您仍将看到所有常规数据都位于图形底部。
手动将异常值的y值更改为某个非极端值。您以后可以通过使用plt.yticks(actual_data_array, what_to_display_array)
生成常规(足够高)的图,然后稍后进行图像处理以剪切图像的中间部分。也许有更好的方法,但是一种方法是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()
它看起来像这样: