【问题标题】:How to plot heatmap from standard deviation of binned data?如何根据分箱数据的标准差绘制热图?
【发布时间】:2021-12-18 15:55:56
【问题描述】:

我正在尝试根据网格数据制作标准偏差 (stdv) 的热图,即我已将数据划分为像网格一样的单元格,我想从每个单元格中获取 stdv 并绘制其值单元格,颜色编码为热图。下面是我用来将 x -y 平面划分为 4 个相等的 bin 或单元格的代码,然后让 v 值落入这 4 个 bin 中。我在每个 bin 中将它们和它们各自的 stdv 打印出来。

import numpy as np
import matplotlib.pyplot as plt
x = np.array([-10,-2,4,12,3,6,8,14,3])
y = np.array([5,5,-6,8,-20,10,2,2,8])
v = np.array([4,-6,-10,40,22,-14,20,8,-10])

xi = x // 20+1

yi = y // 20+1

k=2
cells = [[[] for yi in range(k)] for xi in range(k)]

for ycell in range(k):
    for xcell in range(k):
        cells[ycell][xcell] = v[(yi == xcell) & (xi == ycell)]
       
for ycell in range(k):
    for xcell in range(k):
        this = cells[ycell][xcell]
        print(ycell, xcell, len(this), this, sep='\t')
        print('direct std dev is', np.std(this))

我现在想在 x-y 平面上绘制它,这 4 个 bin 中的每一个都将 stdv 值表示为强度,并显示为如下图所示的热图:

有人可以帮我弄清楚如何创建这种热图吗?谢谢!

【问题讨论】:

    标签: python numpy statistics heatmap binning


    【解决方案1】:

    你的意思是:

    k=2
    cells = [[[] for yi in range(k)] for xi in range(k)]
    stds = [[[] for yi in range(k)] for xi in range(k)]
    
    for ycell in range(k):
        for xcell in range(k):
            cells[ycell][xcell] = v[(yi == xcell) & (xi == ycell)]
    
            # replace invalid (np.nan) with 0
            stds[ycell][xcell] = np.std(cells[ycell][xcell]) or 0
    
    # import plot lib
    import seaborn as sns
    
    # heatmap
    sns.heatmap(stds, cmap='Blues', annot=True)
    

    输出:

    【讨论】:

    • 感谢@Quang!但实际上需要反转 y 轴。这可以通过在最后使用 ax.invert_yaxis() 来完成,它可以工作。
    猜你喜欢
    • 2019-10-17
    • 2019-08-18
    • 2018-12-23
    • 1970-01-01
    • 2021-11-03
    • 2020-12-10
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多