web-dev-qa-db-fra.com

Seaborn Heatmap: déplacer la barre de couleurs en haut de l'intrigue

J'ai une carte thermique de base créée à l'aide de la bibliothèque seaborn et je souhaite déplacer la barre de couleurs de la barre par défaut, verticale et à droite, vers une horizontale au-dessus de la carte thermique. Comment puis-je faire ceci?

Voici quelques exemples de données et un exemple de la valeur par défaut:

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

# Create data
df = pd.DataFrame(np.random.random((5,5)), columns=["a","b","c","d","e"])

# Default heatma
ax = sns.heatmap(df)
plt.show()

default heatmap

10
r3robertson

En regardant la documentation nous trouvons un argument cbar_kws. Cela permet de spécifier l'argument transmis à la méthode fig.colorbar De matplotlib.

cbar_kws: Dict de clé, mappages de valeurs, facultatif. Arguments de mot-clé pour fig.colorbar.

Nous pouvons donc utiliser n'importe lequel des arguments possibles pour fig.colorbar, En fournissant un dictionnaire à cbar_kws.

Dans ce cas, vous avez besoin de location="top" Pour placer la barre de couleur sur le dessus. Étant donné que colorbar positionne par défaut la barre de couleurs à l'aide d'une spécification de grille, qui ne permet alors pas de définir l'emplacement, nous devons désactiver cette spécification de grille (use_gridspec=False).

sns.heatmap(df, cbar_kws = dict(use_gridspec=False,location="top"))

Exemple complet:

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

df = pd.DataFrame(np.random.random((5,5)), columns=["a","b","c","d","e"])

ax = sns.heatmap(df, cbar_kws = dict(use_gridspec=False,location="top"))

plt.show()

enter image description here

14

Vous devez utiliser un diviseur d'axes pour placer la barre de couleurs sur une figure marine. Recherchez les commentaires.

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
from mpl_toolkits.axes_grid1.axes_divider import make_axes_locatable
from mpl_toolkits.axes_grid1.colorbar import colorbar

# Create data
df = pd.DataFrame(np.random.random((5,5)), columns=["a","b","c","d","e"])

# Use axes divider to put cbar on top
# plot heatmap without colorbar
ax = sns.heatmap(df, cbar = False)
# split axes of heatmap to put colorbar
ax_divider = make_axes_locatable(ax)
# define size and padding of axes for colorbar
cax = ax_divider.append_axes('top', size = '5%', pad = '2%')
# make colorbar for heatmap. 
# Heatmap returns an axes obj but you need to get a mappable obj (get_children)
colorbar(ax.get_children()[0], cax = cax, orientation = 'horizontal')
# locate colorbar ticks
cax.xaxis.set_ticks_position('top')

plt.show()

enter image description here

Pour plus d'informations, lisez cet exemple officiel de matplotlib: https://matplotlib.org/gallery/axes_grid1/demo_colorbar_with_axes_divider.html?highlight=demo%20colorbar%20axes%20divider

Heatmap l'argument comme sns.heatmap(df, cbar_kws = {'orientation':'horizontal'}) est inutile car il place la barre de couleurs en bas.

4
Serenity

Je voudrais montrer un exemple avec des sous-tracés qui permet de contrôler la taille du tracé pour préserver la géométrie carrée de la carte thermique. Cet exemple est très court:

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

# Create data
df = pd.DataFrame(np.random.random((5,5)), columns=["a","b","c","d","e"])

# Define two rows for subplots
fig, (cax, ax) = plt.subplots(nrows=2, figsize=(5,5.025),  gridspec_kw={"height_ratios":[0.025, 1]})

# Draw heatmap
sns.heatmap(df, ax=ax, cbar=False)

# colorbar
fig.colorbar(ax.get_children()[0], cax=cax, orientation="horizontal")

plt.show()

enter image description here

4
pcu