【问题标题】:Python heatmap with unequal block sizes块大小不等的 Python 热图
【发布时间】:2020-02-05 09:30:19
【问题描述】:

我有以下数据集:

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 或任何其他绘图包创建这样的图表,如果可以,如何做到这一点?

【问题讨论】:

  • 你能告诉我们一些关于result的事情吗?第一个元素是 x 轴,第二个元素是 y 轴,第三个元素是颜色吗?

标签: python matplotlib seaborn heatmap


【解决方案1】:

一种方法是使用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()

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 2019-12-09
    相关资源
    最近更新 更多