Matplotlib压缩YTicks以供使用

2024-10-05 11:45:30 发布

您现在位置:Python中文网/ 问答频道 /正文

尝试绘制一组点,其中两个点具有极端Y值。是否有一种方法可以在图形上显示这些值,而不会丢失其他点的值。例如:

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

我正在画一个Y刻度为0-50的图表,然后在50-100000之间出现类似大小的间隙,以展示极限点


Tags: 方法图形图表绘制间隙刻度极限点
1条回答
网友
1楼 · 发布于 2024-10-05 11:45:30

不确定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()

看起来是这样的:

enter image description here

相关问题 更多 >

    热门问题