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=True来sns.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没有帮助.)
有没有什么办法解决这一问题?
设置轴限制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)
结果:
您可以square=True在代码中使用参数替换它:
fg.map_dataframe(draw_heatmap, 'label1', 'label2', 'value', cbar=False, square=True)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4854 次 |
| 最近记录: |