调整 matplotlib imshow 中的网格线和刻度线。
调整 matplotlib imshow 中的网格线和刻度线。
我试图绘制一个数值矩阵,并希望添加网格线以使数值之间的边界更清晰。不幸的是,imshow决定将刻度标记放在每个像素的中间位置。是否可能:\na) 删除刻度标记但保留标签在相同位置,\nb) 在像素边界之间添加网格线?\n
import matplotlib.pyplot as plt import numpy as np im = plt.imshow(np.reshape(np.random.rand(100), newshape=(10,10)), interpolation='none', vmin=0, vmax=1, aspect='equal') ax = plt.gca() ax.set_xticks(np.arange(0, 10, 1)) ax.set_yticks(np.arange(0, 10, 1)) ax.set_xticklabels(np.arange(1, 11, 1)) ax.set_yticklabels(np.arange(1, 11, 1))
\n没有网格线且刻度标记位置错误的图像:\n[点击此处查看图片](https://i.stack.imgur.com/axeto.png)\n
ax.grid(color='w', linestyle='-', linewidth=2)
\n网格线位置错误的图像:\n[点击此处查看图片](https://i.stack.imgur.com/gPh7d.png)
问题出现的原因是希望调整matplotlib中imshow的网格线和刻度的位置。解决方法是通过设置坐标轴的刻度和标签,将主要刻度位置设置为每个方格的中心,并将次要刻度设置为每个方格的边缘,并且不显示标签。然后,显示网格线时只显示在次要刻度上。以下是解决方法的代码示例:
ax = plt.gca() ax.set_xticks(np.arange(-.5, 10, 1)) ax.set_yticks(np.arange(-.5, 10, 1)) ax.set_xticklabels(np.arange(1, 12, 1)) ax.set_yticklabels(np.arange(1, 12, 1))
通过上述代码,可以将x轴和y轴的刻度设置为每个方格的中心,并将刻度标签设置为对应的数值。然后,可以使用以下代码将网格线显示在次要刻度上:
ax.grid(which='minor', color='gray', linestyle='-', linewidth=0.5)
通过设置`which='minor'`,可以仅在次要刻度上显示网格线。这样就可以实现将网格线显示在次要刻度上,同时保持标签位于像素的中心的效果。
如果有其他解决该问题的代码或方法,也可以作为新答案进行发布。
调整matplotlib imshow中的网格线和刻度的问题是由于默认设置下,imshow函数在显示图像时没有显示网格线和刻度导致的。解决方法是通过代码来手动调整网格线和刻度的显示。
解决方法如下所示:
import matplotlib.pyplot as plt import numpy as np plt.figure() im = plt.imshow(np.reshape(np.random.rand(100), newshape=(10,10)), interpolation='none', vmin=0, vmax=1, aspect='equal') ax = plt.gca() # 设置主要刻度 ax.set_xticks(np.arange(0, 10, 1)) ax.set_yticks(np.arange(0, 10, 1)) # 设置主要刻度标签 ax.set_xticklabels(np.arange(1, 11, 1)) ax.set_yticklabels(np.arange(1, 11, 1)) # 设置次要刻度 ax.set_xticks(np.arange(-.5, 10, 1), minor=True) ax.set_yticks(np.arange(-.5, 10, 1), minor=True) # 基于次要刻度设置网格线 ax.grid(which='minor', color='w', linestyle='-', linewidth=2) # 移除次要刻度 ax.tick_params(which='minor', bottom=False, left=False) plt.show()
运行以上代码后,将会显示一个带有网格线和刻度的图像。