python-3.x - 如何在Seaborn热图旁边添加列

标签 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

提前致谢!

最佳答案

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

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

您可以修改一些颜色,然后再将它们传递回QuadMesh,然后再设置plt.show()
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()

final figure

P.S.我使用的是python 2.7,尽管我没有想到任何可能,但可能需要对某些语法进行调整。

关于python-3.x - 如何在Seaborn热图旁边添加列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34298052/

相关文章:

python - 类型错误 : to_excel() got multiple values for argument 'sheet_name'

python - 无法在 seaborn distplot 中显示图例

python - seaborn 中 kdeplot x 轴的范围与 data 中的不同

python - 如何在 Windows 中将 python 添加到 cmd

python - 以反射方式在 Python 中创建嵌套类

python - 复制嵌套的自定义对象 : alternatives to deepcopy

matplotlib - 制作带有为每个点指定的标准偏差/置信区间的 seaborn 线图

python - 如何从 matplotlib/seaborn 图中删除或隐藏 y 轴刻度标签

python - Seaborn 热图注释在单元格中的位置

python - python3源代码的类图查看器应用程序