给定下面的代码,它产生一个热图,我如何得到列"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
为一个列,然后访问热图的facet颜色并将其中一些更改为白色.
热图上负责颜色的元素是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()
PS我在Python 2.7上,可能需要一些语法调整,但我想不出任何.