【问题标题】:Heatmap drawing using matplotlib or seaborn?使用 matplotlib 或 seaborn 绘制热图?
【发布时间】:2018-11-23 19:24:25
【问题描述】:

我是 Python 新手。我需要使用这样的数据框在每个网格中绘制带有注释的热图:

t=pd.DataFrame({'ReturnType':['ReturnWithoutReceipt','Return With Receipt',
                          'ReturnWithoutReceipt','Return With Proof Of Purchase','Return With Proof Of Purchase',
                'Return With Receipt'],
                'Payment':['Card','Cash','Cash','Cash','Card','Card'],
                'Hour':[11,12,12,14,16,16],
                'value':[1,26,3,67,17,37],
                'Label':['1.0--11','26.0--12','3.0--12','67.0--14','17.0--16','37.0--16']})

在我的热图中,行是 ReturnType,列是 Payment。颜色由价值决定。标签需要显示在每个网格中。因此,该图将如下所示:

那么如何使用 matplotlib 或 seaborn 来实现呢?

【问题讨论】:

    标签: python pandas matplotlib heatmap seaborn


    【解决方案1】:

    首先通过set_indexunstack 重塑DataFrame

    df = t.set_index(['ReturnType','Payment']).unstack()
    print (df)
                                  Hour      value          Label          
    Payment                       Card Cash  Card Cash      Card      Cash
    ReturnType                                                            
    Return With Proof Of Purchase   16   14    17   67  17.0--16  67.0--14
    Return With Receipt             16   12    37   26  37.0--16  26.0--12
    ReturnWithoutReceipt            11   12     1    3   1.0--11   3.0--12
    

    通过xs 选择每个DataFrame(因为MultiIndex 在列中)

    df1 = df.xs('value', axis=1, level=0)
    lab = df.xs('Label', axis=1, level=0)
    print (df1)
    Payment                        Card  Cash
    ReturnType                               
    Return With Proof Of Purchase    17    67
    Return With Receipt              37    26
    ReturnWithoutReceipt              1     3
    
    print (lab)
    Payment                            Card      Cash
    ReturnType                                       
    Return With Proof Of Purchase  17.0--16  67.0--14
    Return With Receipt            37.0--16  26.0--12
    ReturnWithoutReceipt            1.0--11   3.0--12
    

    最后将第二个DataFrame 传递给参数annot,显示标签的想法来自this answer

    ax = sns.heatmap(df1, annot=lab, fmt="")
    

    【讨论】:

    • 非常感谢。非常清楚。我可以再问一件事:如何在每个网格中放置“标签”字段,重复后给出?
    • @FengChen - 不知道是否明白how to put the field "Label" in every grid, given after duplication,你能解释一下吗?
    • @FengChen - 你觉得ax = sns.heatmap(df, annot=True) 吗?
    • 你好,我用你的图在我的问题中做一个例子。请看一下。我想要的是在每个网格上,都有一个标签值显示在上面。这与 annot 类似。但我需要显示标签字段,而不是值字段。希望我说清楚。
    • @FengChen - 现在明白了,一件小事,需要summean
    【解决方案2】:

    我认为您误解了热图是什么。热图是 M 行 N 列的矩形数组,其中某个索引 (m, n) 处的计数表示为颜色。

    根据您的问题,'value:' 的形状不等于'ReturnType:'Payment:' 的乘积。

    【讨论】:

      猜你喜欢
      • 2019-10-21
      • 2019-07-13
      • 2016-01-21
      • 2015-06-17
      • 2021-03-14
      • 2017-07-12
      • 2020-09-22
      • 2017-11-24
      • 2020-03-31
      相关资源
      最近更新 更多