在Jupyter Noteb中使用matplotlib imshow时截断的像素

2024-04-20 16:30:28 发布

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

我用过pyplot.imshow公司很多次,但我以前在用imshow绘制数值网格时从未遇到过这个问题。当打印一个小图像时,将刻度/标签调整为位于每个像素边缘的中心,生成的图像将切掉像素的顶行和底行的一半。在

理想情况下,我会有记号和标签在每个像素的边缘居中,所有像素都将以完整、方形的大小显示,而不会被截断。在

我在运行一个Jupyter笔记本,上面有一个工作示例:

%matplotlib notebook
import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots(1,2)
ax[0].imshow(np.arange(9).reshape((3,3)))
ax[0].set(xticks=np.arange(3),
          xticklabels=['D', 'E', 'F'], yticklabels=['', 'A', '', 'B', '', 'C' ''])
ax[0].set_title('Pixels with undesirable ticks')

im1 = ax[1].imshow(np.arange(9).reshape((3,3)))
ax[1].set(xticks=np.arange(3), yticks=np.arange(3),
       xticklabels=['D', 'E', 'F'], yticklabels=['A', 'B', 'C'])
ax[1].set_title('Cut off pixels with desired ticks')
plt.show()

这将生成以下图像,其中我希望完整图像如左侧所示,但标记和标签以每个像素为中心,如右侧所示:

3x3 image examples

(编辑) 再进行一些测试后,我可以通过在调用imshow中包含extent参数来解决问题:

^{pr2}$

或者通过显式设置范围:

im1.set_extent([-0.5, 2.5, -0.5, 2.5])

所以。。。为什么默认范围没有显示为方形?在


Tags: 图像importmatplotlibnpplt像素标签ax