【问题标题】:How to add column next to Seaborn heat map如何在 Seaborn 热图旁边添加列
【发布时间】:2016-01-04 07:58:04
【问题描述】:

鉴于下面的代码生成热图,我怎样才能获得“D”列(总列) 显示为热图右侧的一列,没有颜色,只是对齐每个单元格的总值?我也在尝试将标签移到顶部。我不介意左侧的标签是水平的,因为我的实际数据不会出现这种情况。

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
%matplotlib inline
df = pd.DataFrame(
      {'A' : ['A', 'A', 'B', 'B','C', 'C', 'D', 'D'],
       'B' : ['A', 'B', 'A', 'B','A', 'B', 'A', 'B'],
       'C' : [2, 4, 5, 2, 0, 3, 9, 1],
       'D' : [6, 6, 7, 7, 3, 3, 10, 10]})

df=df.pivot('A','B','C')
fig, ax = plt.subplots(1, 1, figsize =(4,6))

sns.heatmap(df, annot=True, linewidths=0, cbar=False)
plt.show()

这是想要的结果:

提前致谢!

【问题讨论】:

    标签: python-3.x seaborn


    【解决方案1】:

    我认为最简洁的方法(尽管可能不是最短的)是将Total 绘制为列之一,然后访问热图各方面的颜色并将其中一些更改为白色。

    负责热图上颜色的元素是matplotlib.collections.QuadMesh。它包含用于热图每个方面的所有facecolors,从左到右,从下到上。

    您可以在plt.show() 之前修改一些颜色并将它们传回QuadMesh

    seaborn 更改了一些注释的文本颜色以使其在深色背景下可见,而当您更改为白色时它们变得不可见,这是一个小问题。所以现在我将所有文本的颜色设置为黑色,你需要找出最适合你的情节的颜色。

    最后,要将 x 轴刻度和标签放在顶部,请使用:

    ax.xaxis.tick_top()
    ax.xaxis.set_label_position('top') 
    

    最终版本的代码:

    import matplotlib.pyplot as plt
    from matplotlib.collections import QuadMesh
    from matplotlib.text import Text
    
    import seaborn as sns
    import pandas as pd
    import numpy as np
    %matplotlib inline
    
    df = pd.DataFrame(
          {'A' : ['A', 'A', 'B', 'B','C', 'C', 'D', 'D'],
           'B' : ['A', 'B', 'A', 'B','A', 'B', 'A', 'B'],
           'C' : [2, 4, 5, 2, 0, 3, 9, 1],
           'D' : [6, 6, 7, 7, 3, 3, 10, 10]})
    
    df=df.pivot('A','B','C')
    
    # create "Total" column
    df['Total'] = df['A'] + df['B']
    
    fig, ax = plt.subplots(1, 1, figsize =(4,6))
    
    sns.heatmap(df, annot=True, linewidths=0, cbar=False)
    
    # find your QuadMesh object and get array of colors
    quadmesh = ax.findobj(QuadMesh)[0]
    facecolors = quadmesh.get_facecolors()
    
    # make colors of the last column white
    facecolors[np.arange(2,12,3)] = np.array([1,1,1,1])
    
    # set modified colors
    quadmesh.set_facecolors = facecolors
    
    # set color of all text to black
    for i in ax.findobj(Text):
        i.set_color('black')
    
    # move x ticks and label to the top
    ax.xaxis.tick_top()
    ax.xaxis.set_label_position('top') 
    
    plt.show()
    

    附:我在 Python 2.7 上,可能需要进行一些语法调整,但我想不出。

    【讨论】:

      猜你喜欢
      • 2014-01-13
      • 1970-01-01
      • 2020-04-10
      • 2019-08-12
      • 2021-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多