python 在matplotlib imshow中调整网格线和刻度

snvhrwxg  于 2022-11-21  发布在  Python
关注(0)|答案(5)|浏览(211)

我试图绘制一个数值矩阵,并希望添加网格线以使数值之间的边界更清晰。不幸的是,imshow决定将刻度线定位在每个体素的中间。是否可以
a)去除扁虱,但将标签留在相同位置,以及
B)在像素边界之间添加网格线?

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));

没有网格线且刻度线位于错误位置

的图像

ax.grid(color='w', linestyle='-', linewidth=2)

网格线位置错误的图像:

e0bqpujr

e0bqpujr1#

Serenity建议的解决方案代码:

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();

# Major ticks
ax.set_xticks(np.arange(0, 10, 1))
ax.set_yticks(np.arange(0, 10, 1))

# Labels for major ticks
ax.set_xticklabels(np.arange(1, 11, 1))
ax.set_yticklabels(np.arange(1, 11, 1))

# Minor ticks
ax.set_xticks(np.arange(-.5, 10, 1), minor=True)
ax.set_yticks(np.arange(-.5, 10, 1), minor=True)

# Gridlines based on minor ticks
ax.grid(which='minor', color='w', linestyle='-', linewidth=2)

# Remove minor ticks
ax.tick_params(which='minor', bottom=False, left=False)

生成的图像:

brc7rcf0

brc7rcf02#

尝试移动轴刻度:

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

ozxc1zmp

ozxc1zmp3#

您会发现使用plt.pcolorplt.pcolormesh更容易:

data = np.random.rand(10, 10)
plt.pcolormesh(data, edgecolors='k', linewidth=2)
ax = plt.gca()
ax.set_aspect('equal')

不过,它们和plt.imshow之间也有一些不同,最明显的是图像被Y轴交换了(不过你可以通过添加ax.invert_yaxis()轻松地将其反转回来)。When to use imshow over pcolormesh?

0aydgbwb

0aydgbwb4#

通过将extent参数传递给imshow,可以移动像素。extent是一个4元素的标量列表(左、右、下、上):

foo = np.random.rand(35).reshape(5, 7)
# This keeps the default orientation (origin at top left):
extent = (0, foo.shape[1], foo.shape[0], 0)
_, ax = plt.subplots()
ax.imshow(foo, extent=extent)
ax.grid(color='w', linewidth=2)
ax.set_frame_on(False)

ih99xse1

ih99xse15#

这是一种黑客,但我喜欢使用它,因为它不需要我移动xticks或yticks。

import numpy as np
import matplotlib.pyplot as plt

plt.matshow(np.random.random(size=(10,10)))

plt.hlines(y=np.arange(0, 10)+0.5, xmin=np.full(10, 0)-0.5, xmax=np.full(10, 10)-0.5, color="black")
plt.vlines(x=np.arange(0, 10)+0.5, ymin=np.full(10, 0)-0.5, ymax=np.full(10, 10)-0.5, color="black")

plt.show()

相关问题