Heatmaps

en langage python

L'essentiel de cette page !

On peut visualiser facilement une dataframe pandas ou une array avec python.

J'ai développé une fonction qui permet de facilement le faire (sans préciser le format), en centrant-réduisant automatiquement les données et en précisant quelle variable imposé (optionnel) pour trier les données (code ci-dessous).

Sinon, des exemples simples apparaissent plus bas dans cette page, permettant notamment de clusteriser.

Exemple d'utilisation de ma fonction heatmap (qui marche aussi sur les arrays).

import seaborn as sns

iris = sns.load_dataset("iris")

heatmap(iris, y = iris.species, transpose = True) # Afficher y trié selon species

from numpy.random import normal as normal

mym = np.round(normal(10,2,12**2).reshape(24,6),0)

heatmap(mym, 4 , cmap="seismic") # Afficher la matrice en triant selon la colonne 5

Fonction heatmap() à copier-coller - Cliquer sur ce titre pour dérouler le code

#######################################

# heatmap (pour dataframe pandas & arrays)

# version 11/11/2021

#######################################

import matplotlib.pyplot as plt

import seaborn as sns

import pandas as pd

import numpy as np

from sklearn.preprocessing import LabelEncoder

from sklearn.preprocessing import StandardScaler

def heatmap(x=None,y=[],transpose=False,cmap="viridis"):

x_temp = x.copy()

if isinstance(x_temp, pd.DataFrame)==True : # procédure pandas

# Numériser les variables non numériques

ind_num = np.isin(x_temp.dtypes,['int16','int32','int64','float64','float16','float32'])

ind_nonum = np.logical_not(ind_num)

x.iloc[:,ind_nonum]= x_temp.iloc[:,ind_nonum].astype('category')

ind_nonum = np.where(ind_nonum==True)

for col in ind_nonum :

LE = LabelEncoder()

x_temp.iloc[:,col] = LE.fit_transform(x_temp.iloc[:,col])

x_temp.iloc[:,col] = x_temp.iloc[:,col].astype('float64')

x_temp = x_temp.sub(x_temp.mean())

x_temp = x_temp.div(x_temp.std())

# Trier si y != None

if len(y) > 0 : # y ici doit être une série pandas

ordre = sorted(range(len(y)), key=lambda k: y[k])

x_temp = x_temp.iloc[ordre,:]

if (transpose==True) :

x_temp = x_temp.T

sns.set()

sns.heatmap(x_temp,cmap=cmap)

plt.show()

elif isinstance(x, (np.ndarray, np.generic))==True :

print("array")# procédure array

scaler = StandardScaler()

scaler.fit(x)

x_temp=scaler.transform(x)

if len([y])>0 : # y ici doit être un numéro de colonne

ordre = sorted(range(x.shape[0]), key=lambda k: x_temp[:,y][k])

print(ordre)

x_temp = x_temp[ordre,:]

if (transpose==True) :

x_temp = x_temp.transpose()

sns.set()

sns.heatmap(x_temp,cmap=cmap)

plt.show()

else :

sys.exit('Erreur! x ni pandas ni array')

1- Visualiser les données d'une data.frame pandas facilement en mode heatmap avec seaborn

import seaborn as sns

# Charger le jeu de données iris

iris = sns.load_dataset('iris')

print(iris)

# Suppression de la colonne contenant les catégories

iris2 = iris.iloc[:,0:4]

# Affichage de la heatmap

from matplotlib import pyplot as plt

sns.heatmap(iris2)

plt.show()

2- Centrer-Réduire les données avant affichage avec la fonction scale() de sklearn.preprocessing

from sklearn.preprocessing import scale

iris3 = scale(iris2)

from matplotlib import pyplot as plt

sns.heatmap(iris3)

plt.show()

Cette image diffère de celle du dessus, cette fois-ci les données de chaque variable ont été centrées et réduites.

3- Clusteriser directement sur le heatmap