matplotlib热图,自定义y轴

时间:2017-12-09 00:07:27

标签: matplotlib heatmap

现在我的代码看起来像这样:

#generate 262*20 elements
values = np.random.random(262*20).tolist()
# convert the list to a 2D NumPy array
values = np.array(values).reshape((262, 20))
h, w = values.shape
#h=262, w=20
fig = plt.figure(num=None, dpi=80,figsize=(9, 7), facecolor='w', edgecolor='k')   
ax = fig.add_subplot(111)
#fig, ax = plt.subplots()
plt.imshow(values)
plt.colorbar()
plt.xticks(np.arange(w), list('PNIYLKCVFWABCDEFGHIJ'))
ax.set_aspect(w/h)
plt.show()

情节如下:

enter image description here

如您所见,y轴的范围是0-261。

但我希望我的y轴从26变为290,缺少57,239和253.所以仍然总共262。我试图生成一个这样的列表:

mylist =[26, 27, ......missing 57, 239, 253, ....290]
plt.yticks(np.arange(h), mylist)

Y轴看起来就像是一切都挤在一起。

所以我试过了:

pylab.ylim([26, 290])

看起来像这样:

enter image description here

因此,感觉第一行中的数据始终对应于[0],而不是[26]

1 个答案:

答案 0 :(得分:1)

建议您使用pcolormesh。如果您需要间隙,请对具有间隙的区域使用numpy.ma.masked数组。

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import numpy as np

values = np.random.rand(290,20)
values[:26, :] = np.NaN
values[ [57, 239, 253], :] = np.NaN
values = np.ma.masked_invalid(values)

h, w = values.shape
fig, ax = plt.subplots(figsize=(9,7))
# Make one larger so these values represent the edge of the data pixels.
y = np.arange(0, 290.5)
x = np.arange(0, 20.5)

pcm = ax.pcolormesh(x, y, values, rasterized=True) # you don't need rasterized=True
fig.colorbar(pcm)
plt.xticks(np.arange(w), list('PNIYLKCVFWABCDEFGHIJ'))
plt.show()

Result

编辑:如果你想使用262x20阵列工作:

values = np.random.rand(262,20)

h, w = values.shape
fig, ax = plt.subplots(figsize=(9,7))
# Make one larger so these values represent the edge of the data pixels.
y = np.arange(0, 290.5)
y = np.delete(y, [57, 239, 253])
y = np.delete(y, range(26))

x = np.arange(0, 20.5)

pcm = ax.pcolormesh(x, y, values, rasterized=True) # you don't need rasterized=True
fig.colorbar(pcm)
plt.xticks(np.arange(w), list('PNIYLKCVFWABCDEFGHIJ'))

plt.show()

请注意,这不会在57,239和253处添加空行。如果您需要,则需要执行以下操作:

values = np.random.rand(262,20)
Z = np.ones((290, 20)) * np.NaN
inds = set(range(290)) - set(list(range(26)) + [57, 239, 253])
for nn, ind in enumerate(inds):
    Z[ind, :] = values[nn,:]

h, w = values.shape
fig, ax = plt.subplots(figsize=(9,7))
# Make one larger so these values represent the edge of the data pixels.
y = np.arange(0, 290.5)

x = np.arange(0, 20.5)

pcm = ax.pcolormesh(x, y, Z, rasterized=True) # you don't need rasterized=True
fig.colorbar(pcm)
plt.xticks(np.arange(w), list('PNIYLKCVFWABCDEFGHIJ'))

plt.show()