2016-04-27 11 views
6

Czy istnieje sposób ustawienia skali paska kolorów w celu zalogowania wykresu mapy ciepła ptaka nad morzem?
Używam obrotowy stół wyjście z pand jako wejście do rozmowySeaborn Heatmap z logarytmiczną kolorową kreską

sns.heatmap(df_pivot_mirror,annot=False,xticklabels=256,yticklabels=128,cmap=plt.cm.YlOrRd_r) 

dziękuję.

Odpowiedz

8

Tak, ale Seaborn ma zakodowane liniowy lokalizator tick dla colorbar, więc wynik może nie być zupełnie co chcesz:

# http://matplotlib.org/examples/pylab_examples/pcolor_log.html 
# modified to use seaborn 

import matplotlib.pyplot as plt 
from matplotlib.colors import LogNorm 
import numpy as np 
from matplotlib.mlab import bivariate_normal 
import seaborn as sns; sns.set() 


N = 20 
X, Y = np.mgrid[-3:3:complex(0, N), -2:2:complex(0, N)] 

# A low hump with a spike coming out of the top right. 
# Needs to have z/colour axis on a log scale so we see both hump and spike. 
# linear scale only shows the spike. 
Z1 = bivariate_normal(X, Y, 0.1, 0.2, 1.0, 1.0) + 0.1 * bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) 

fig, axs = plt.subplots(ncols=2) 

sns.heatmap(Z1, ax = axs[0]) 
sns.heatmap(Z1, ax = axs[1], 
      #cbar_kws={'ticks':[2,3]}, #Can't specify because seaborn does 
      norm=LogNorm(vmin=Z1.min(), vmax=Z1.max())) 


axs[0].set_title('Linear norm colorbar, seaborn') 
axs[1].set_title('Log norm colorbar, seaborn') 
plt.show() 

Zobacz pylab przykład ten rozpoczął się na wersję pylab że automatycznie otrzymuje etykiety pasków kolorów (choć w przeciwnym razie nie jest tak piękne).

spiky data with linear and log colorbar

można edytować kod Seaborn aby to działało: Jeśli zmienia funkcję w /seaborn/matrix.py plot() (wersja 0.7.0):

# Possibly add a colorbar 
    if self.cbar: 
     ticker = mpl.ticker.MaxNLocator(6) 
     if 'norm' in kws.keys(): 
      if type(kws['norm']) is mpl.colors.LogNorm: 
       ticker = mpl.ticker.LogLocator(numticks=8) 

otrzymasz:

enter image description here

będę sugerować, że na github Seaborn, ale jeśli chcesz go wcześniej, nie jest.

+1

Problem z seabornem https://github.com/mwaskom/seaborn/issues/459 sprawia, że ​​można go naprawić (inaczej) – cphlewis

+0

Jedyne, co jest, jeśli niektóre z twoich wartości są negatywne, to jest problem. Hiperboliczny odwrotny sin (arcsinh) działa lepiej dla wartości ujemnych i 0. – wordsforthewise

+0

Nie ma wbudowanego arcsinh w matplotlib, ale można użyć SymLogNorm dla wartości ujemnych. Nie jestem pewien, czy obsługuje on jednak cyfry 0. https://matplotlib.org/devdocs/tutorials/colors/colormapnorms.html#sphx-glr-tutorials-colors-colormapnorms-py – wordsforthewise

1

Odpowiadając na cphlewis (nie mam wystarczającej reputacji), rozwiązałem ten problem, używając cbar_kws; jak widziałem tutaj: seaborn clustermap: set colorbar ticks.

Na przykład cbar_kws={"ticks":[0,1,10,1e2,1e3,1e4,1e5]}.

s=np.random.rand(20,20) 
sns.heatmap(s, norm=LogNorm(s.min(),s.max()), 
      cbar_kws={"ticks":[0,1,10,1e2,1e3,1e4,1e5]}, 
      vmin = 0.001, vmax=10000) 
plt.show() 

Miłego dnia.

Powiązane problemy