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.
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).
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:
Je vais suggérer cela sur le github né en mer, mais si vous le voulez plus tôt, le voici.
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}
)
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.