更改 matplotlib imshow()图形轴上的值

假设我有一些输入数据:

data = np.random.normal(loc=100,scale=10,size=(500,1,32))
hist = np.ones((32,20)) # initialise hist
for z in range(32):
hist[z],edges = np.histogram(data[:,0,z],bins=np.arange(80,122,2))

我可以使用 imshow()绘制它:

plt.imshow(hist,cmap='Reds')

获得:

enter image description here

但是,x 轴值与输入数据不匹配(即平均值为100,范围从80到122)。因此,我想更改 x 轴以显示 edges中的值。

我试过了:

ax = plt.gca()
ax.set_xlabel([80,122]) # range of values in edges
...
# this shifts the plot so that nothing is visible

还有

ax.set_xticklabels(edges)
...
# this labels the axis but does not centre around the mean:

enter image description here

对于如何更改轴值以反映我正在使用的输入数据,有什么想法吗?

219282 次浏览

如果可能的话,我会尽量避免改变 xticklabels,否则它会变得非常混乱,例如,如果你用额外的数据重绘你的直方图。

定义网格的范围可能是最好的,使用 imshow可以通过添加 extent关键字来完成。这样轴线就可以自动调整。如果你想改变标签,我会使用 set_xticks与可能一些格式化程序。直接更改标签应该是最后的手段。

fig, ax = plt.subplots(figsize=(6,6))


ax.imshow(hist, cmap=plt.cm.Reds, interpolation='none', extent=[80,120,32,0])
ax.set_aspect(2) # you may also use am.imshow(..., aspect="auto") to restore the aspect ratio

enter image description here

我有一个类似的问题,谷歌是送我到这个职位。我的解决方案有点不同,也不那么紧凑,但希望这对某些人有用。

使用 matplotlib.pyplot.imshow 显示图像通常是显示2D 数据的一种快速方法。但是默认情况下,这会使用像素计数来标记轴。如果要绘制的2D 数据对应于由数组 x 和 y 定义的统一网格,那么可以使用 matplotlib.pyplot.xticks 和 matplotlib.pyplot.yticks 使用这些数组中的值来标记 x 和 y 轴。它们将一些标签(对应于实际的网格数据)与轴上的像素计数相关联。这样做比例如使用 pcolor 要快得多。

下面是一个关于你的数据的尝试:

import matplotlib.pyplot as plt


# ... define 2D array hist as you did


plt.imshow(hist, cmap='Reds')
x = np.arange(80,122,2) # the grid to which your data corresponds
nx = x.shape[0]
no_labels = 7 # how many labels to see on axis x
step_x = int(nx / (no_labels - 1)) # step between consecutive labels
x_positions = np.arange(0,nx,step_x) # pixel count at label position
x_labels = x[::step_x] # labels you want to see
plt.xticks(x_positions, x_labels)
# in principle you can do the same for y, but it is not necessary in your case