web-dev-qa-db-fra.com

Carte thermique Seaborn avec barre de couleur à l'échelle logarithmique

Existe-t-il un moyen de définir l’échelle de la barre de couleur pour se connecter sur un graphique de carte marine?
J'utilise une sortie de tableau croisé dynamique de pandas comme entrée de l'appel

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

Je vous remercie.

12
fulatoro

Oui, mais Seaborn a codé en dur un localisateur de ticks linéaire pour la barre de couleurs. Le résultat pourrait donc ne pas être tout à fait ce que vous voulez:

# 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()

Voir l'exemple de pylab avec lequel cela a commencé pour une version de pylab qui obtient automatiquement les étiquettes de ticks de la barre de couleur (bien que ce ne soit pas aussi joli). 

 spiky data with linear and log colorbar

Vous pouvez éditer le code Seaborn pour le faire fonctionner: si vous modifiez la fonction plot() dans /seaborn/matrix.py (ver 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)

vous recevez:

 enter image description here

Je vais suggérer cela sur le github né en mer, mais si vous le voulez plus tôt, le voici.

11
cphlewis

Vous pouvez normaliser les valeurs de la barre de couleurs avec matplotlib.colors.LogNorm . Je devais également définir manuellement les étiquettes dans Seaborn et obtenir le code suivant:

#!/usr/bin/env python3

import math

import numpy as np
import seaborn as sn
from matplotlib.colors import LogNorm

data = np.random.Rand(20, 20)

log_norm = LogNorm(vmin=data.min().min(), vmax=data.max().max())
cbar_ticks = [math.pow(10, i) for i in range(math.floor(math.log10(data.min().min())), 1+math.ceil(math.log10(data.max().max())))]

sn.heatmap(
    data,
    norm=log_norm,
    cbar_kws={"ticks": cbar_ticks}
)

heatmap Rand

4
user2084795

En réponse à cphlewis (je n'ai pas assez de réputation), j'ai résolu ce problème en utilisant cbar_kws; comme je l'ai vu ici: seaborn clustermap: définir les ticks de la barre de couleur .

Par exemple 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()

Bonne journée.

0
Jándrë