2017-01-04 13 views
7

में हीटमैप स्क्वायर कैसे बनाएं I Seaborn के FacetGrid कक्षा का उपयोग कर रहे हैं ताकि 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=Truesns.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 बनाने में मदद नहीं करता है।)

क्या इसे ठीक करने का कोई तरीका है?

+0

आप सवाल अनजाने मेरे सवाल का हल! (गर्मी के ग्रिड बनाने के लिए कैसे)। – anthonybell

उत्तर

2

जब आप FacetGrid के तर्क को केवल अक्ष सीमाएं ही सेट करते हैं लेकिन धुरी लेबल और शीर्षक के आकार और पदों को उचित धुरी ज्यामिति की गणना करने के लिए भी ध्यान में रखा जाता है। इसलिए heatmaps आयताकार हैं।

वर्गबद्ध तापमैप और अक्ष समायोजित करने के लिए आप फंक्शन 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() 

परिणाम:

enter image description here

संबंधित मुद्दे