我正在使用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)
产生这张图片:
注意矩阵图的元素是矩形的,而不是方形的。如果我制作了一个地块(没有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,看起来轴对于数据来说太大了。(并且在构造aspect=1
时明确设置FacetGrid
帮助。)
有什么方法可以解决这个问题吗?
答案 0 :(得分: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()
结果:
答案 1 :(得分:0)
您可以在代码中使用square=True
参数代替该参数:
fg.map_dataframe(draw_heatmap, 'label1', 'label2', 'value', cbar=False, square=True)