为了账号安全,请及时绑定邮箱和手机立即绑定

块大小不等的 Python 热图

块大小不等的 Python 热图

不负相思意 2022-07-19 16:46:16
我有以下数据集:results=[array([6.06674849e-18, 2.28597646e-03]), array([0.02039694, 0.01245901, 0.01264321, 0.00963068]), array([2.28719585e-18, 5.14800709e-02, 2.90957713e-02, 0.00000000e+00,       4.22761202e-19, 3.21765246e-02, 8.86959187e-03, 0.00000000e+00])]我想从中创建一个热图,类似于下图:是否可以使用 seaborn 或 matplotlib 或任何其他绘图包创建这样的图表,如果可以,该怎么做?
查看完整描述

1 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

一种方法是用 使行长度相等np.repeat。仅当所有行的长度都是最长行长度的除数时,这才有效。


数据建议使用LogNorm,尽管这样的规范会因样本输入中的零而分心。


一些代码来说明这个想法:


from matplotlib import pyplot as plt

from matplotlib import colors as mcolors

import numpy as np


results = [np.array([6.06674849e-18, 2.28597646e-03]),

           np.array([0.02039694, 0.01245901, 0.01264321, 0.00963068]),

           np.array([2.28719585e-18, 5.14800709e-02, 2.90957713e-02, 0.00000000e+00,

                     4.22761202e-19, 3.21765246e-02, 8.86959187e-03, 0.00000000e+00])]

longest = max([len(row) for row in results])

equalized = np.array( [np.repeat(row, longest // len(row)) for row in results])

# equalized = np.where(equalized == 0, np.NaN, equalized)

norm = mcolors.LogNorm()

heatmap = plt.imshow(equalized, cmap='nipy_spectral', norm=norm, interpolation='nearest',

                     origin='lower', extent=[0, 6000, 0.5, len(results)+0.5])

plt.colorbar(heatmap)

plt.gca().set_aspect('auto')

plt.yticks(range(1, len(results) + 1))

plt.show()

//img1.sycdn.imooc.com//62d66f820001cbbc13250478.jpg

另一个具有 7 个级别(随机数)的示例。输入生成为:

bands = 7
results = [np.random.uniform(0, 1, 2**i) for i in range(1, bands+1)]

//img1.sycdn.imooc.com//62d66f910001d64221100492.jpg

查看完整回答
反对 回复 2022-07-19
  • 1 回答
  • 0 关注
  • 66 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信