热图与 matplotlib 使用 matshow

Posted

技术标签:

【中文标题】热图与 matplotlib 使用 matshow【英文标题】:Heatmap with matplotlib using matshow 【发布时间】:2014-02-26 11:42:04 【问题描述】:

我正在尝试生成 10x10 矩阵的热图。矩阵中的所有值都是概率;所有元素的总和等于 1.0。我决定使用 matshow 绘图类型(它看起来很容易使用),但是到目前为止我无法生成我想要的输出。

1.视觉上看起来有点丑。你会推荐一个适合用于热图的颜色图吗?

2.有没有办法在使用 matshow 时将预定义的 bin 分配给颜色图?例如。采用 1000 种颜色的渐变,始终为相应的概率使用相同的颜色。在默认行为中,我认为 matshow 检查最小值和最大值,将渐变中的第一个和最后一个颜色分配给这些值,然后通过插值对它们之间的值进行着色。

有时我在矩阵中有非常相似的概率,而其他时候概率的范围可能很大。由于我在上面试图解释的默认行为,我得到了类似的图,这使得比较更加困难。

顺便说一下,我用于生成上述热图(和示例图)的代码如下。

谢谢!

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

def pickcoord():
    i = np.random.randint(0,10)
    j = np.random.randint(0,10)
    return [i,j]

board = np.zeros((10,10))
for i in range(1000000):

    try:
        direction = np.random.randint(0,2)
        new_board = np.zeros((10,10))
        coords = pickcoord()

        if direction == 1:
            for k in range(2):
                new_board[coords[0]][coords[1]+k] = 1
        else:
            for k in range(2):
                new_board[coords[0]+k][coords[1]] = 1

    except IndexError:
        new_board = np.zeros((10,10))

    board = board + new_board

board_prob = board/np.sum(board)

plt.figure(figsize=(6,6))
plt.matshow(board_prob, cmap=matplotlib.cm.Spectral_r, interpolation='none')
plt.xticks(np.arange(0.5,10.5), [])
plt.yticks(np.arange(0.5,10.5), [])
plt.grid()

【问题讨论】:

【参考方案1】:

您的第二个问题可以使用matshow 函数的vminvmax 参数来解决:

matshow(board_prob, cmap=cm.Spectral_r, interpolation='none', vmin=0, vmax=1)

考虑到您的第一个问题,这取决于您要强调或显示的内容。从default colormaps of matplotlib 中选择合适的颜色图。

【讨论】:

以上是关于热图与 matplotlib 使用 matshow的主要内容,如果未能解决你的问题,请参考以下文章

如何为 matplotlib.pyplot.matshow 绘图添加标签和标题

matplotlib savefig() 大小控制

使用 Matplotlib 绘制 2D 热图

使用 Matplotlib 在带有图例的热图中显示不同大小的圆圈

使用散点数据集在 MatPlotLib 中生成热图

Matplotlib 相关热图中缺少标签