Python 带有自定义图例的Seaborn热图

Python 带有自定义图例的Seaborn热图,python,matplotlib,seaborn,Python,Matplotlib,Seaborn,我有一个大的数据集,我将简化这个问题。我希望根据列值创建自定义图例。让我举例说明 df2 = DataFrame(np.array([[1.0, 2.0, 3.0, 'sensitve'], [4.0, 5.0, 6.0, 'sensitive'], [7.0, 8.0, 9.0, 'not sensitive']]), columns=['a', 'b', 'c', 'd'], index = ['A', 'B', 'C']) 我希望制作一个热图,

我有一个大的数据集,我将简化这个问题。我希望根据列值创建自定义图例。让我举例说明

   df2 = DataFrame(np.array([[1.0, 2.0, 3.0, 'sensitve'], [4.0, 5.0, 6.0, 'sensitive'], [7.0, 8.0, 9.0, 'not sensitive']]),
                   columns=['a', 'b', 'c', 'd'], index = ['A', 'B', 'C'])
我希望制作一个热图,并在顶部有一个图例,以查看该行是否敏感

首先,我对值进行排序

df2 = df2.sort_values('d')
并删除了最后一列,因为它不是一个数字,也不能在热图中

df2 = df2.iloc[:, :-1].astype(float).T
在我用sns创建热图之后:

sns.heatmap(df2, yticklabels = False)#, cmap="viridis")
我该如何在哪些列的顶部做一个标记?像这样的


您可以在热图上方的子图中用这些值绘制表格

df2 = pd.DataFrame(np.array([[1.0, 2.0, 3.0, 'sensitve'], [4.0, 5.0, 6.0, 'sensitive'], [7.0, 8.0, 9.0, 'not sensitive']]),
               columns=['a', 'b', 'c', 'd'], index = ['A', 'B', 'C'])
df2 = df2.sort_values('d')

d_col = df2['d'].T
df2 = df2.iloc[:, :-1].astype(float).T

# set subplot height ratios to avoid large empty space above the table
fig, (ax_table,ax_heatmap) = plt.subplots(2,1, figsize = [8,8], gridspec_kw = {'height_ratios':[1,9]})
sns.heatmap(df2, linewidth = 1, ax = ax_heatmap)
# only using 2 unique d_col values and setting colWidths to fit your drawing
ax_table.table([d_col.unique()], colWidths = [1/3,2/3], cellLoc = 'center')
ax_table.axis('off')

# setting table size to fit heatmap following https://stackoverflow.com/questions/66825885/centering-a-table-with-a-heatmap
bbox_heatmap = ax_heatmap.get_position()
bbox_table = ax_table.get_position()    
left = bbox_heatmap.x0
bottom = bbox_table.y0
width = bbox_heatmap.x0 + (bbox_heatmap.width * 0.8)
height = bbox_table.height * 1.2    
ax_table.set_position([left, bottom, width, height])

plt.show()
哪些产出:


查看以了解进一步的调整。

嘿!谢谢你的评论,这是一个很好的主意。如果你不介意的话,还有一个问题:)为什么我的图片到处都有迷你子图?你可以指定迷你子图是什么意思吗?我的意思是,如果我使用更大的数据集,那里什么都没有。如果我把它切成更小的一组,它会工作,但如果我使用所有的东西,就不会有热图。真奇怪如果您完全复制了我的代码,请尝试从热图调用中删除线宽。如果figsize(8 x 8)相对较小,线宽为1,则单元格可能非常小,并被线条覆盖。或者,如果它有相同数量的列,但有许多行,那么也可以覆盖它。另外,确保热图调用已将ax参数指定给一个轴。也就是说,如果没有特定的代码和输出,就很难知道。