2010-02-23 5 views
14

Dans maptplotlib, il est possible de créer une représentation heatmap d'une matrice de corrélation à l'aide de la fonction imshow. Par définition, une telle matrice est symétrique autour de sa diagonale principale, il n'est donc pas nécessaire de présenter à la fois les triangles supérieur et inférieur. Par exemple: correlation matrixTracer uniquement le triangle supérieur/inférieur d'une carte thermique

L'exemple ci-dessus a été prise de this site Malheureusement, je ne pouvais pas comprendre comment faire cela dans matplotlib. Le réglage de la partie supérieure/inférieure de la matrice sur Aucun entraîne un triangle noir. J'ai googlé pour « les valeurs manquantes matplotlib », mais n'a pas pu trouver quoi que ce soit utile

+1

Peut-être qu'ils ne sont que photoshopped :) – endolith

Répondre

16

Le problème avec la réponse fournie par doug est qu'il repose sur le fait que la palette de couleurs mappe les valeurs nulles en blanc. Cela signifie que les cartes de couleurs qui n'incluent pas la couleur blanche ne sont pas utiles. La clé de la solution est la fonction cm.set_bad. Vous masquez les parties inutiles de la matrice avec Aucune ou avec des tableaux masqués NumPy et set_bad en blanc, au lieu du noir par défaut. L'adoption de l'exemple de doug nous obtenons les suivantes:

import numpy as NP 
from matplotlib import pyplot as PLT 
from matplotlib import cm as CM 

A = NP.random.randint(10, 100, 100).reshape(10, 10) 
mask = NP.tri(A.shape[0], k=-1) 
A = NP.ma.array(A, mask=mask) # mask out the lower triangle 
fig = PLT.figure() 
ax1 = fig.add_subplot(111) 
cmap = CM.get_cmap('jet', 10) # jet doesn't have white color 
cmap.set_bad('w') # default value is 'k' 
ax1.imshow(A, interpolation="nearest", cmap=cmap) 
ax1.grid(True) 
PLT.show() 
+0

sympa! travaille aussi avec 'pcolorme', ce dont j'avais besoin pour cette solution. Notez également que pour exclure la diagonale, changez également 'k = -1' en' k = 0' dans la ligne 'mask = NP.tri (A.shape [0], k = 0)' – Vlox

7
import numpy as NP 
from matplotlib import pyplot as PLT 
from matplotlib import cm as CM 

A = NP.random.randint(10, 100, 100).reshape(10, 10) 
# create an upper triangular 'matrix' from A 
A2 = NP.triu(A) 
fig = PLT.figure() 
ax1 = fig.add_subplot(111) 
# use dir(matplotlib.cm) to get a list of the installed colormaps 
# the "_r" means "reversed" and accounts for why zero values are plotted as white 
cmap = CM.get_cmap('gray_r', 10) 
ax1.imshow(A2, interpolation="nearest", cmap=cmap) 
ax1.grid(True) 
PLT.show() 

plot http://img444.imageshack.us/img444/9585/cmapgrayr.png

+1

Merci d'avoir inclus vos importations. Les exemples exécutables sont très utiles. – jcdyer

0

Avec seaborn et numpy, une solution rapide est:

import matplotlib.pyplot as plt 
import seabon as sns 

# Say your matrix object (e.g. np.array) is corr_mat 

# Get the upper triangle without the diagonal 
corr_mat = np.triu(corr_mat, k=1) 

# Plot the heatmap 
ax = sns.heatmap(corr_mat) 

S'il vous plaît, se référer à seaborn document en ligne pour le maquillage.