Matplotlib:绘制对角矩阵时网格大小不均匀

Matplotlib: uneven grid size when plotting diagonal matrix

我注意到 Pythons Matplotlib 的一个令人沮丧的问题,其中矩阵绘图产生 不均匀的网格。无论有没有高 DPI,以及在 EPS 文件中,这个问题都持续存在。

以下代码用于图像生成:

import matplotlib.pyplot as plt
import numpy as np

arr = np.zeros((200,200))
# Set the diagonal to 1
arr[np.arange(200), np.arange(200)] = 1

plt.matshow(arr)
plt.savefig('matshow_test.png', dpi=1000)

DPI=1000:

尺寸为 65x65、90x90、95x95、90x90、95x95 等。

DPI=默认

每个单元格在 1x1 和 2x2 之间变化。

乳胶中呈现的 EPS:

明显变形了。

我的问题是:

  1. 为什么这是 Matplotlib 的默认行为?
  2. 我该如何解决这个问题?

使用 Python 3.9.10 和 Matplotlib 3.5.1

matplotlib 函数 matshow 在图像上使用抗锯齿过滤器。不幸的是,即使是矢量图形后端,如 (e)ps、pdf 或 svg,它也被启用。这意味着,图像被光栅化、抗锯齿到特定大小,然后内联到矢量图形中。

抗锯齿考虑了特定的显示分辨率 (dpi) 和图像大小。如果您在查看图像时更改这些参数(例如放大时),图像可能会严重扭曲,正如您所经历的那样。

有关于 matplotlib imshow(以及使用相同机制的 matshow)的默认抗锯齿的讨论here

您应该能够通过使用

禁用抗锯齿来解决您的问题(并获得真实的矢量图形)
matshow(..., interpolation='none')

选项。