调整 matplotlib imshow 中的网格线和刻度线。

29 浏览
0 Comments

调整 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)

0
0 Comments

问题出现的原因是希望调整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'`,可以仅在次要刻度上显示网格线。这样就可以实现将网格线显示在次要刻度上,同时保持标签位于像素的中心的效果。

如果有其他解决该问题的代码或方法,也可以作为新答案进行发布。

0
0 Comments

问题的出现原因是使用plt.imshow函数时,网格线和刻度的调整比较麻烦。解决方法是使用plt.pcolormesh函数代替plt.imshow,并设置参数edgecolors='k'和linewidth=2来调整网格线的颜色和宽度。然后通过plt.gca()获取当前的坐标系对象ax,并使用ax.set_aspect('equal')来调整网格的纵横比。最后,如果需要将图像通过Y轴翻转回来,可以使用ax.invert_yaxis()函数。使用plt.pcolormesh函数可以更方便地调整网格线和刻度,而不需要手动处理。

0
0 Comments

调整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()

运行以上代码后,将会显示一个带有网格线和刻度的图像。

0