如何在Seaborn热图旁边添加列

时间:2015-12-15 19:46:29

标签: python-3.x seaborn

根据下面的代码生成热图,如何获得列“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()

这是理想的结果:

Desired Result

提前致谢!

1 个答案:

答案 0 :(得分:5)

我认为最干净的方式(尽管可能不是最短的)可能是将matplotlib.collections.QuadMesh绘制为其中一列,然后访问热图的facet颜色并将其中一些更改为白色。 / p>

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

您可以在plt.show()之前修改某些颜色并将其传回seaborn

有一个小问题,ax.xaxis.tick_top() ax.xaxis.set_label_position('top') 会更改某些注释的文本颜色,使其在深色背景上可见,并且当您更改为白色时它们将变为不可见。所以现在我将所有文字的颜色设置为黑色,你需要找出最适合你情节的文字。

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

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()

代码的最终版本:

{{1}}

final figure

P.S。我在Python 2.7上,可能需要进行一些语法调整,但我想不出任何。