如何在 Seaborn 热图旁边添加列
How to add column next to Seaborn heat map
给出下面的代码,它生成了一个热图,我怎样才能得到第 "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()
这是想要的结果:
提前致谢!
我认为最干净的方法(虽然可能不是最短的)是将 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()
P.S。我正在使用 Python 2.7,可能需要进行一些语法调整,但我想不出任何调整。
给出下面的代码,它生成了一个热图,我怎样才能得到第 "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()
这是想要的结果:
提前致谢!
我认为最干净的方法(虽然可能不是最短的)是将 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()
P.S。我正在使用 Python 2.7,可能需要进行一些语法调整,但我想不出任何调整。