Mis a jour le 2025-04-14, 12:10

Heatmap et clustermap

Heatmap

heatmap : Pour la matrice suivante :
array([[ 0,  2,  4,  6,  8, 10],
       [ 0,  3,  6,  9, 12, 15],
       [ 0,  4,  8, 12, 16, 20],
       [ 0,  5, 10, 15, 20, 25],
       [ 0,  6, 12, 18, 24, 30],
       [ 0,  7, 14, 21, 28, 35]])
  
ar = numpy.array([0, 1, 2, 3, 4, 5]) mat = numpy.dot(ar.reshape(1, 6).T + 2, ar.reshape(1, 6)) df = pandas.DataFrame(mat, columns = ['A', 'B', 'C', 'D', 'E', 'F'], index = ['a', 'b', 'c', 'd', 'e', 'f']) seaborn.heatmap(df, annot = True, cbar = True, cmap = 'plasma') pyplot.tight_layout()
  • on peut utiliser une matrice, ou un dataframe. Si on utilise un dataframe, les noms des colonnes et des lignes sont utilisés dans la représentation.
  • vmin et vmax : valeurs minimales et maximales pour l'échelle de couleur (sinon, c'est le min et le max des données qui sont utilisés).
  • center : la valeur à laquelle la color map doit être centrée pour des données divergentes.
  • cmap : color map de matplotlib ou aussi une liste de couleurs à utiliser.
  • annot = True : indique dans chaque cellule la valeur.
  • annot = dfAnnot : dfAnnot est un dataframe de même géométrie que les valeurs et qui donne le nom à afficher (plutôt que la valeur numérique) :
  • fmt = '.2f' : indique le format à utiliser pour l'annotation de chaque cellule. Utiliser fmt = 'd' pour avoir des entiers
  • cbar = True : affiche une barre montrant la gamme de couleurs.
  • seaborn.heatmap(..., center = 0, cmap = 'RdBu_r') : permet d'indiquer la valeur centrale à utiliser pour la palette.
  • xticklabels = True, yticklabels = True : pour avoir les étiquettes de toutes les lignes et de toutes les colonnes (par défaut, xticklabels et yticklabels sont à 'auto', ce qui veut dire que le nombre d'étiquettes est déterminé pour ne pas en avoir trop). xticklabels = False : pas d'étiquette.
  • square = True : pour avoir des carrés pour les cellules
  • annot_kws = {'fontsize': 8} : pour indiquer la taille de la police dans les cellules.
  • pyplot.gcf().suptitle(title) : pour mettre un titre (pyplot.title ne marche pas).
  • pyplot.gcf().set_size_inches(20, 10); pyplot.savefig('file.png', bbox_inches='tight') : si les étiquettes des lignes sont très longues.
  • pour tourner les étiquettes des colonnes :
    for lab in pyplot.gca().get_xticklabels():
      lab.set(rotation = 90, ha = 'right')
      lab.set_rotation(90)
        
  • pour changer la taille des étiquettes :
    • g.ax_heatmap.set_yticklabels(g.ax_heatmap.get_yticklabels(), fontsize = 10)
    • ou alors :
      for tickLabel in g.figure.axes[0].get_xaxis().get_ticklabels():
        tickLabel.set_fontsize(7)
      	
  • pour représenter une couleur correspondant à NA :
    colorMap = matplotlib.cm.get_cmap('Blues').copy()
    colorMap.set_bad('gray')
    seaborn.heatmap(df, cmap = colorMap)
          
Heatmap avec des limites discrètes déterminées à l'avance (le constructeur BoundaryNorm renvoie une fonction myNorm qui transforme les valeurs en entiers qui va servir de numéro de la couleur) : df = pandas.DataFrame({'A': [1, 7, 20, 60], 'B': [3, 5, 30, 9]}, index = ['a', 'b', 'c', 'd']) boundaries = [0, 1, 5, 10, 50, 100] colors = seaborn.light_palette('navy', n_colors = len(boundaries)).as_hex() myColorMap = matplotlib.colors.ListedColormap(colors, name = 'myColorMap') myNorm = matplotlib.colors.BoundaryNorm(boundaries, len(boundaries)) ax = seaborn.heatmap(df, vmin = boundaries[0], vmax = boundaries[-1], cmap = myColorMap, norm = myNorm, xticklabels = True, yticklabels = True, cbar = False, linecolor = 'gray', linewidths = 0.5) pyplot.gcf().colorbar(matplotlib.cm.ScalarMappable(norm = myNorm, cmap = myColorMap), format = "%3d", ax = ax)

Clustermap

Utilise scipy pour faire un double clustering hierarchique.
On peut donner une array numpy ou un dataframe pandas : ar = numpy.array([[5, 4, 5, 6, 5], [6, 3, 4, 5, 1], [1, 6, 4, 2, 7], [4, 1, 2, 3, 0], [2, 7, 5, 3, 8]]) df = pandas.DataFrame(ar, columns = ['A', 'B', 'C', 'D', 'E'], index = ['a', 'b', 'c', 'd', 'e']) seaborn.clustermap(df, cmap = 'Spectral_r', method = 'ward')
  • method = 'single' : méthode pour l'aggrégation (single, complete, average, ward, centroid, ...)
  • metric = 'euclidean' : distance à utiliser (euclidean, cosine, correlation, canberra, cityblock, hamming, jaccard, mahalanobis, minkowski, ...).
  • z_score = 0 : calcule un z-score par ligne avant de faire le clustering (z_score = 1 pour le faire par colonne). Le défaut est de ne pas calculer de z-score.
  • standard_scale = 0 : même principe qu'avec le paramètre z_score, mais en normalisant par (x - min) / (max - min)
  • center = 0 : permet de centrer l'échelle de couleur, notamment utile avec des palettes comme RdBu_r ou bwr
  • row_cluster = False : ne fait pas de clustering des lignes (défaut est True)
  • col_cluster = False : ne fait pas de clustering des colonnes (défaut est True)
  • annot = True : indique dans chaque cellule la valeur.
  • annot = dfAnnot : dfAnnot est un dataframe de même géométrie que les valeurs et qui donne le nom à afficher (plutôt que la valeur numérique) : seaborn.clustermap(df, annot = dfAnnot, fmt = 's')
  • pour supprimer les étiquettes le long de l'axe des y : g = seaborn.clustermap(...); g.ax_heatmap.yaxis.set_visible(False)
  • figsize = (5, 5) : taille de la figure.
  • cbar_kws = {'ticks': [0, 5, 10], 'label': 'myLabel'} : permet d'indiquer les graduations un titre à la barre de couleurs.
  • row_colors = ['red', 'green', 'red', 'red'] : liste de couleurs à faire figurer sur une barre verticale indiquant l'appartenance à un groupe, avec autant de valeurs que de lignes du dataframe (cf graphe ci-dessous).
  • col_colors = ['blue', 'blue', 'gray'] : liste de couleurs à faire figurer sur une barre verticale indiquant l'appartenance à un groupe (cf graphe ci-dessous).
  • colors_ratio = (0.05, 0.01) : indique l'épaisseur des barres précisées par row_colors et col_colors respectivement.
  • mask = df2 : masque les cellules (les met en blanc) où la valeur du dataframe de même dimension que le dataframe représenté est True.
  • dendrogram_ratio = (0.05, 0.3) : la hauteur relative des arbres en ligne et en colonne (utiliser 0 pour faire disparaître l'arbre)
  • cbar_pos = (1, 0.2, 0.2, 0.5) : la position et la taille de la barre de couleurs entre 0 et 1, avec les 4 valeurs : left, bottom, width, height. Utiliser None pour faire disparaître la barre de couleurs
  • g = seaborn.clustermap(...); g.ax_heatmap.set_title(myTitle) : pour mettre un titre à la clustermap (et non pyplot.title(myTitle)).
  • réglage de la taille des étiquettes et d'autres propriétés :
    g = seaborn.clustermap(...)
    for lab in g.ax_heatmap.get_xticklabels():
      lab.set_fontsize(26)
      if lab.get_text().startswith('_'):
        lab.set_color('gray')
      lab.set_fontfamily('monospace')
          
  • g.ax_heatmap.tick_params('x', rotation = 90) : fait pivoter les étiquettes de l'axe des x (colonnes)
  • g.ax_heatmap.set_xlabel('my Label') : pour changer le label.
  • pyplot.setp(g.ax_heatmap.get_xticklabels(), rotation = 45) : fait pivoter les étiquettes de l'axe des x (colonnes)
  • g.ax_row_dendrogram.set_visible(False) : masque le dendrogramme par ligne
  • g.ax_cbar.set_visible(False) : masque la color bar.
  • quand on veut afficher des valeurs ou des noms dans les cellules :
    • définir un dataframe df2 qui a la même géométrie, même index et columns que le dataframe df avec les valeurs
    • seaborn.clustermap(df, annot = dfAnnot, fmt = 's') (fmt indique comment formatter les valeurs dans df2 ('s' si string, '.2g' par exemple pour des flottants, etc ...)
df = pandas.DataFrame({'A': [2, 3, 5, 6], 'B': [7, 4, 9, 12], 'C': [1, 3, 4, 8]}, index = ['a', 'b', 'c', 'd']) g = seaborn.clustermap(df, cmap = 'RdBu_r', method = 'average', figsize = (5, 5), cbar_kws = {'ticks': [-1, 0, 1], 'label': 'myLabel'}, row_colors = ['red', 'green', 'red', 'red'], col_colors = ['blue', 'blue', 'gray'], z_score = 1, center = 0, dendrogram_ratio = (0.05, 0.3), colors_ratio = (0.05, 0.01), cbar_pos = (1, 0.2, 0.2, 0.5)) g.ax_heatmap.tick_params('x', rotation = 90) for lab in g.ax_heatmap.get_xticklabels(): lab.set_fontsize(20) lab.set_color('gray') lab.set_fontfamily('monospace')
Utiliser clustermap sans dendrograme ni colorbar pour avoir un maximum de place pour la heatmap :
g = seaborn.clustermap(df, cmap = 'Blues', xticklabels = True, yticklabels = True,
  dendrogram_ratio = 0.01, col_cluster = False)
g.cax.set_visible(False)
g.ax_row_dendrogram.set_visible(False)
pyplot.suptitle('mon titre')
pyplot.gcf().set_size_inches(10, 10)
pyplot.tight_layout()
  

Copyright python-simple.com
programmer en python, tutoriel python, graphes en python, Aymeric Duclert