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

jb3*_*326 16 python matplotlib seaborn

我正在使用Seaborn的FacetGrid类来使用该heatmap功能绘制一组矩阵,也来自Seaborn.但是,我无法调整这些子图的纵横比.这是一个例子:

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)
Run Code Online (Sandbox Code Playgroud)

这会产生这样的图像:

水平阵列的图

注意矩阵图的元素是矩形的,而不是方形的.如果我做一个图(无FacetGrid),我可以通过选项square=Truesns.heatmap使情节广场.但是,如果我把它放在参数中map_dataframe,我得到这个结果:

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

用方形选项制作的一系列地块

看起来轴对于数据来说太大了,即使它的默认宽高比FacetGrid是1.(并且aspect=1在构造时明确设置FacetGrid没有帮助.)

有没有什么办法解决这一问题?

Ser*_*ity 6

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

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

另一种方式有些棘手。功能ax.set_aspect与第二个参数box_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()
Run Code Online (Sandbox Code Playgroud)

结果:

在此处输入图片说明


use*_*737 6

您可以square=True在代码中使用参数替换它:

fg.map_dataframe(draw_heatmap, 'label1', 'label2', 'value', cbar=False, square=True)
Run Code Online (Sandbox Code Playgroud)