如何控制pyplot pcolor热图的单元格大小?

时间:2015-08-27 18:10:04

标签: python matplotlib heatmap

我有一对数字列表代表二维空间中的点,我想将这些点的y / x比率表示为一维热图,其中发散的颜色图集中在1左右,或者我的比率的日志,发散的彩色地图以0为中心。

我该怎么做?

我目前的尝试(从Heatmap in matplotlib with pcolor?稍微借用):

from matplotlib import numpy as np
import matplotlib.pyplot as plt
# There must be a better way to generate arrays of random values
x_values = [np.random.random() for _ in range(10)]
y_values = [np.random.random() for _ in range(10)]
labels = list("abcdefghij")
ratios = np.asarray(y_values) / np.asarray(x_values)
axis = plt.gca()
# I transpose the array to get the points arranged vertically
heatmap = axis.pcolor(np.log2([ratios]).T, cmap=plt.cm.PuOr)
# Put labels left of the colour cells
axis.set_yticks(np.arange(len(labels)) + 0.5, minor=False)
# (Not sure I get the label order correct...)
axis.set_yticklabels(labels)
# I don't want ticks on the x-axis: this has no meaning here
axis.set_xticks([])
plt.show()

我不满意的一些观点:

  • 我获得的有色细胞是水平伸长的矩形。我想控制这些细胞的宽度并获得一列细胞。
  • 我想为彩色地图添加一个图例。 heatmap.colorbar = plt.colorbar()RuntimeError: No mappable was found to use for colorbar creation. First define a mappable such as an image (with imshow) or a contour set (with contourf).
  • 失败

一点很重要:

  • matplotlib / pyplot总是让我感到困惑:似乎有很多方法可以做,我在文档中迷失了方向。我永远不知道"清洁"做我想做的事情:我欢迎阅读材料的建议,这些材料可以帮助我澄清我对这些事情的非常近似的理解。

1 个答案:

答案 0 :(得分:3)

还有两行:

axis.set_aspect('equal') # X scale matches Y scale
plt.colorbar(mappable=heatmap) # Tells plt where it should find the color info.

无法很好地回答你的最后一个问题。部分原因是我们在matplotlib中有两个分支处理:轴方式(axis.do_something ...)和MATLAB克隆方式plt.some_plot_method。不幸的是,我们无法改变这一点,这是人们迁移到matplotlib的一个很好的功能。至于"清洁方式"我担心,我更喜欢使用产生较短代码的东西。我想这与Python座右铭是一致的:简单比复杂的可读性计数更好。

enter image description here