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

2024-04-23 23:39:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Seaborn的FacetGrid类,使用同样来自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)

生成此图像的:

horizontal array of plots

注意矩阵图的元素是矩形的,而不是正方形的。如果我做一个绘图(没有FacetGrid),我可以将选项square=True传递给sns.heatmap,使绘图成正方形。但是,如果我把它放在map_dataframe的参数中,就会得到这样的结果:

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

array of plots made with square option

尽管FacetGrid的默认宽高比为1,但轴对于数据来说似乎太大了。(并且在构造FacetGrid时显式设置aspect=1没有帮助。)

有什么办法解决这个问题吗?


Tags: importdataasnpargsrangepdsns
2条回答

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

若要调整二次热图和轴,可以使用函数set_bbox手动设置校正的轴边界框位置。

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

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()

结果:

enter image description here

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

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

相关问题 更多 >