2017-01-04 55 views
7

我使用Seaborn的FacetGrid類來使用Seaborn的heatmap函數繪製一組矩陣。但是,我無法調整這些子圖的縱橫比。下面是一個例子:如何在Seaborn FacetGrid中生成熱圖貼圖

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 (並明確地設置aspect=1時,構建FacetGrid沒有幫助。)

有沒有什麼辦法解決這個問題?

+0

你的問題解決了不經意間我的問題! (如何製作熱點圖)。 – anthonybell

回答

2

當您設置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() 

結果:

enter image description here