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


89

说我有一些输入数据:

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

得到:

在此处输入图片说明

但是,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:

在此处输入图片说明

关于如何更改轴值以反映正在使用的输入数据的任何想法?


使用pcolor而不是imshow如本答案中所述
Nirmal

Answers:


142

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

在此处输入图片说明


18
还值得注意的是,interpolation="none"这里使用的是真实数据的更准确表示。

4
最有用的答案;我用它来绘制两个变量(即地震数据)的函数的色图。我还在imshow()中添加了“ aspect ='auto'”选项,以便可以“拉伸和挤压”地震显示。
2014年

10

我有一个类似的问题,谷歌将我发送到这篇文章。我的解决方案有所不同,并且不太紧凑,但是希望这对某人有用。

使用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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.