【问题标题】:How to make heatmap square in Seaborn FacetGrid如何在 Seaborn FacetGrid 中制作热图正方形
【发布时间】:2017-05-19 04:22:02
【问题描述】:

我正在使用 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)

生成此图像:

注意矩阵图的元素是矩形的,而不是正方形的。如果我正在制作一个情节(没有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)

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

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

【问题讨论】:

  • 你的问题无意间解决了我的问题! (如何制作热图网格)。

标签: python matplotlib seaborn


【解决方案1】:

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

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

另一种方法有点棘手。带有第二个参数box_forced 的函数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()

结果:

【讨论】:

【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-23
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 2015-11-22
    • 2016-05-15
    相关资源
    最近更新 更多