Matplotlib Matshow标签

34

我一个月前开始使用matplotlib,所以我还在学习中。
我正在尝试使用matshow做一个热力图。我的代码如下:

data = numpy.array(a).reshape(4, 4)  
cax = ax.matshow(data, interpolation='nearest', cmap=cm.get_cmap('PuBu'), norm=LogNorm())  
cbar = fig.colorbar(cax)

ax.set_xticklabels(alpha)  
ax.set_yticklabels(alpha)

alpha是django的一个模型,有4个字段:'ABC','DEF','GHI'和'JKL'。

问题是我不知道为什么标签'ABC'没有出现,导致最后一个单元格没有标签。
如果有人知道如何修改我的脚本以使'ABC'出现,我将不胜感激 :)

2个回答

69
发生的情况是在使用matshow时,xticks实际上会延伸到显示的图形之外。(我不太确定为什么会这样。虽然我几乎从未使用过matshow。)
为了证明这一点,请查看ax.get_xticks()的输出。在您的情况下,它是array([-1., 0., 1., 2., 3., 4.])。因此,当您设置xtick标签时,“ABC”位于<-1,-1>处,并且未显示在图中。
最简单的解决方法就是在标签列表的开头添加一个空白标签,例如:
ax.set_xticklabels(['']+alpha)
ax.set_yticklabels(['']+alpha)

完整的示例代码:

import numpy as np
import matplotlib.pyplot as plt

alpha = ['ABC', 'DEF', 'GHI', 'JKL']

data = np.random.random((4,4))

fig = plt.figure()
ax = fig.add_subplot(111)
cax = ax.matshow(data, interpolation='nearest')
fig.colorbar(cax)

ax.set_xticklabels(['']+alpha)
ax.set_yticklabels(['']+alpha)

plt.show()

Matshow示例


谢谢!我已经能够看到相同的东西 :)但是我有另一个问题...我正在做两个热图,一个是(4x4),另一个是(9x9)。程序标记热图为0、2、4、6、8...所以当我尝试标记时,它只给那些数字命名。我已经尝试了ax.set_xticks(matplotlib.numpy.arange(len(list_names))),但它会减小单元格的大小... - psoares
2
@Patricia - 如果您手动设置刻度位置,那么在设置完毕后调用 ax.axis('image') 应该可以解决您所描述的问题。希望能对您有所帮助! - Joe Kington
谢谢!问题解决了 :) 所以ax.axis('image')会恢复原始图像的大小,对吗? - psoares
基本上,当设置刻度位置时,轴限制发生变化可能是一个错误。有关ax.axis('image')的更多信息,请参见此处:http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.axis - Joe Kington

11
另一种方法是指定刻度,然后设置相应的标签。那么您就不必担心额外的越界刻度了。这在许多matplotlib演示中都会出现。因此,在这里请注意额外调用ax.set_xticksax.set_yticks
import numpy as np
import matplotlib.pyplot as plt

alpha = ['ABC', 'DEF', 'GHI', 'JKL']

data = np.random.random((4,4))

fig = plt.figure()
ax = fig.add_subplot(111)
cax = ax.matshow(data, interpolation='nearest')
fig.colorbar(cax)

xaxis = np.arange(len(alpha))
ax.set_xticks(xaxis)
ax.set_yticks(xaxis)
ax.set_xticklabels(alpha)
ax.set_yticklabels(alpha)

plt.show()

输入图片说明


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接