2015-02-06 11 views
11

Oto przykład, który pokazuje colorbar dla każdej poletko:Jeden colorbar dla Seaborn mapy cieplne w poletko

import seaborn as sns 
import matplotlib.pyplot as plt 
import pandas as pd 
import numpy as np 

df = pd.DataFrame(np.random.random((10,10,))) 

fig,axn = plt.subplots(2, 2, sharex=True, sharey=True) 

for ax in axn.flat: 
    sns.heatmap(df, ax=ax) 

enter image description here

Jak można usunąć colorbars dla każdej poletko? Chciałbym mieć tylko jeden pasek kolorów, który jest zorientowany pionowo lub poziomo. Wiem, że mam dostęp do każdej osi barwowej za pomocą fig.get_axes()[:-4], ale jak mogę ją całkowicie usunąć z wątku? Nie sądzę, że istnieje opcja rezygnacji z rysowania paska koloru po wywołaniu mapy termicznej.

Odpowiedz

24

Parametr cbar określa, czy należy dodać pasek kolorów, a parametr cbar_ax może opcjonalnie określić osie, do których powinien przejść pasek kolorów. Tak, można to zrobić.

import seaborn as sns 
import matplotlib.pyplot as plt 
import pandas as pd 
import numpy as np 

df = pd.DataFrame(np.random.random((10,10,))) 

fig, axn = plt.subplots(2, 2, sharex=True, sharey=True) 
cbar_ax = fig.add_axes([.91, .3, .03, .4]) 

for i, ax in enumerate(axn.flat): 
    sns.heatmap(df, ax=ax, 
       cbar=i == 0, 
       vmin=0, vmax=1, 
       cbar_ax=None if i else cbar_ax) 

fig.tight_layout(rect=[0, 0, .9, 1]) 

(Dostaniesz ostrzeżenie o tight_layout tutaj, ale faktycznie jest prawidłowa, ponieważ złożyliśmy cbar_ax explicite Jeśli nie lubisz widząc ostrzeżenie, można również zadzwonić tight_layout przed spiskowaniem, ale nie będzie tak mocno).

+0

Świetne rozwiązanie. To było bardzo pomocne. Dzięki. – drg

+2

Czy jesteś pewien, że to również zsynchronizuje kolory? Sposób, w jaki to widzę, wykreśla tylko mapę kolorów dla pierwszej osi, ale mapa kolorów niekoniecznie będzie kompatybilna z innymi osiami. – bayer

+3

Dobra uwaga. Będziesz chciał określić 'vmin' i' vmax' – mwaskom

Powiązane problemy