使用子图时,Seaborn热图宽度不匹配

至500

我正在尝试将第二个子图的宽度(二进制cmap的列总和)调整为第一个子图的宽度。

到目前为止,我只能通过随机选择不同的figsize来做到这一点,但是每次我尝试在不同大小的数据集上重用代码时,我总是想出如下图所示(第二个热图总是比第一个大) )。

我是否缺少自动调整第二个功能的内容?

在此处输入图片说明

import matplotlib.pyplot as plt    
import seaborn as sns   
import pandas as pd
test = pd.DataFrame({'user': ['Bob', 'Bob', 'Bob','Janice','Janice','Fernand','Kevin','Sidhant'], 
                     'tag' : ['enfant','enfant','enfant','femme','femme','jeune','jeune','jeune'],
                   'income': [3, 5, 1,14,8,10,13,17]})
  
# specify font sizes for later:

titlesize= 30
ticklabel = 23
legendlabel = 23

# Generate custom diverging colormaps:

cmap = sns.color_palette("ch:18,-.1,dark=.3",  6)
cmap2 = sns.color_palette("binary",  6)

# Preparing data for the heatmap:

heatmap1_data = pd.pivot_table(test, values='income', 
                                 index=['user'], 
                                 columns='tag')
heatmap1_data = heatmap1_data.reindex(heatmap1_data.sum().sort_values(ascending=False).index, axis=1)

# Creating figure:

fig, (ax1, ax2) = plt.subplots(2,1,figsize=(10,15))

# First subplot:

sns.heatmap(heatmap1_data, ax= ax1, cmap=cmap,square=True, linewidths=.5, annot=True, cbar = False,annot_kws={"size": legendlabel} )

# Cosmetic first subplot:

ax1.xaxis.tick_top()
ax1.tick_params(labelsize= ticklabel, top = False)
ax1.set_xlabel('')
ax1.set_ylabel('')
ax1.set_xticklabels(heatmap1_data.columns,rotation=90)
ax1.set_yticklabels(heatmap1_data.index,rotation=0)
ax1.set_title("Activités par agence et population vulnérable", size= titlesize, pad=20)

# Second subplot (column sum at the bottom):

sns.heatmap((pd.DataFrame(heatmap1_data.sum(axis=0))).transpose().round(1), ax=ax2, square=True, fmt='g', linewidths=.5, annot=True, cmap=cmap2 , cbar=False, xticklabels=False, yticklabels=False, annot_kws={"size": legendlabel})
ax2.set_xlabel("Nombre d'activités", size = ticklabel, labelpad = 5)

# More cosmetic:

ax1.set_title("Title", size= titlesize, pad=35)
ax1.set_xlabel('')
ax1.set_ylabel('')
plt.tick_params(labelsize= ticklabel,left=False, bottom=False)
plt.xticks(rotation=60)
ax1.spines['bottom'].set_color('#dfe1ec')
ax1.spines['left'].set_color('#dfe1ec')
ax1.spines['top'].set_color('#dfe1ec')
ax1.spines['right'].set_color('#dfe1ec')
plt.tight_layout()

plt.show()
熊熊

问题是使用square=Truesns.heatmap由于两个子图的长宽比是宽的还是高的,因此“平方”的完成方式各不相同。首先,它变得更薄,第二,它变得更短。通过这种方式可以适应子图轴大小的约束,这些约束在调用时默认定义为相等plt.subplots

解决此问题的一种方法是将两个轴的长宽比定义为不同并适合数据的形状。这不会100%地起作用,但在大多数情况下会起作用。您可以在中调用来使用关键字gridspec_kw并定义一个词典'height_ratios'plt.subplots

fig, (ax1, ax2) = plt.subplots(2,1, figsize=(10,15), gridspec_kw={'height_ratios':[5, 1]})

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用seaborn热图

来自分类Dev

将子图与pyplot barplot和seaborn热图对齐

来自分类Dev

Seaborn热图颜色图

来自分类Dev

使用Seaborn FacetGrid绘制相关热图

来自分类Dev

使用Seaborn扩大热图的大小

来自分类Dev

使用pandas数据框的seaborn热图

来自分类Dev

Python seaborn 热图网格 - 不采用预期的列

来自分类Dev

子图中的seaborn热图的一个颜色条

来自分类Dev

子图中的Seaborn热图-对齐x轴

来自分类Dev

Seaborn热图-仅在值高于给定阈值时显示热图

来自分类Dev

热图Seaborn Annot错误

来自分类Dev

Seaborn 热图以失败告终

来自分类Dev

使用对数刻度时,Seaborn热图在颜色栏上生成其他刻度

来自分类Dev

使用非索引变量订购Seaborn热图

来自分类Dev

使用python和seaborn从数据帧生成热图

来自分类Dev

使用 matplotlib 的热图

来自分类Dev

seaborn 中的子图

来自分类Dev

使用Seaborn的Matplotlib中的子图错误

来自分类Dev

使用 seaborn pairplot 绘制子图

来自分类Dev

使用Seaborn和Matplotlib在热图和折线图的共享子图中对齐x轴刻度

来自分类Dev

子图的子图 Matplotlib / Seaborn

来自分类Dev

Seaborn热图图中的离散图例

来自分类Dev

Seaborn热图:自定义标签

来自分类Dev

Seaborn热图关键词

来自分类Dev

Python-Seaborn:修改热图图例

来自分类Dev

Seaborn热图按行排列颜色

来自分类Dev

为Seaborn热图分配特定颜色

来自分类Dev

Seaborn热图轴中的日期

来自分类Dev

Seaborn自定义范围热图