Python 如何在Seaborn FaceGrid中制作热图正方形

Python 如何在Seaborn FaceGrid中制作热图正方形,python,matplotlib,seaborn,Python,Matplotlib,Seaborn,我正在使用Seaborn的FaceGrid类,使用同样来自Seaborn的heatmap函数绘制一组矩阵。但是,我无法调整这些子地块的纵横比。以下是一个例子: import seaborn as sns import numpy as np import pandas as pd # Generate a set of sample data np.random.seed(0) indices = pd.MultiIndex.from_product((range(5), range(5),

我正在使用Seaborn的
FaceGrid
类,使用同样来自Seaborn的
heatmap
函数绘制一组矩阵。但是,我无法调整这些子地块的纵横比。以下是一个例子:

import seaborn as sns
import numpy as np
import pandas as pd

# Generate a set of sample data
np.random.seed(0)
indices = pd.MultiIndex.from_product((range(5), range(5), range(5)), names=('label0', 'label1', 'label2'))
data = pd.DataFrame(np.random.uniform(0, 100, size=len(indices)), index=indices, columns=('value',)).reset_index()

def draw_heatmap(*args, **kwargs):
    data = kwargs.pop('data')
    d = data.pivot(index=args[1], columns=args[0], values=args[2])
    sns.heatmap(d, **kwargs)

fg = sns.FacetGrid(data, col='label0')
fg.map_dataframe(draw_heatmap, 'label1', 'label2', 'value', cbar=False)
生成此图像的:

请注意,矩阵图的元素是矩形的,而不是方形的。如果我正在绘制一个绘图(没有
FacetGrid
),我可以将选项
square=True
传递到
sns.heatmap
,以绘制正方形。但是,如果我把它放在
map\u dataframe
的参数中,我会得到以下结果:

fg = sns.FacetGrid(data, col='label0')
fg.map_dataframe(draw_heatmap, 'label1', 'label2', 'value', cbar=False, square=True)

看起来轴对于数据来说太大了,即使
FaceGrid
的默认纵横比是1。(在构建
FacetGrid
时,显式设置
aspect=1
没有帮助。)


有没有办法解决这个问题?

当您设置
FaceGrid
aspect
参数时,不仅要考虑轴限制,还要考虑轴标签和标题的大小和位置,以计算正确的轴几何图形。因此,热图是矩形的

要调整二次热图和轴,您可以使用功能
set_bbox
手动设置校正的轴边界框位置

另一种方法有点棘手。函数
ax.set\u aspect
使用第二个参数
box\u forced
将尝试调整热图和轴。 但是,要完全删除保留的灰色边框,您可以通过根据图形面颜色设置轴背景颜色来隐藏它,如下所示:

import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pylab as plt

# Generate a set of sample data
np.random.seed(0)
indices = pd.MultiIndex.from_product((range(5), range(5), range(5)),
 names=('label0', 'label1', 'label2'))
data = pd.DataFrame(np.random.uniform(0, 100, size=len(indices)),
 index=indices, columns=('value',)).reset_index()

def draw_heatmap(*args, **kwargs):
    data = kwargs.pop('data')
    d = data.pivot(index=args[1], columns=args[0], values=args[2])
    sns.heatmap(d, **kwargs)

fg = sns.FacetGrid(data, col='label0')
fg.map_dataframe(draw_heatmap, 'label1', 'label2', 'value', cbar=False, square = True)
# get figure background color
facecolor=plt.gcf().get_facecolor()
for ax in fg.axes.flat:
    # set aspect of all axis
    ax.set_aspect('equal','box-forced')
    # set background color of axis instance
    ax.set_axis_bgcolor(facecolor)
plt.show()
结果:

您可以在代码中使用参数替换此参数:

fg.map_dataframe(draw_heatmap, 'label1', 'label2', 'value', cbar=False, square=True)

你的问题无意中解决了我的问题!(如何制作热图网格)。老问题,但我仍然想知道是否可以为热图网格显示一个色条,有什么想法吗?我认为不再允许使用“框强制”;现在它被称为“盒子”