2010-02-23 27 views
14

En maptplotlib, uno puede crear una representación heatmap de una matriz de correlación utilizando la función imshow. Por definición, una matriz tal es simétrico alrededor de su diagonal principal, por lo tanto no hay necesidad de presentar tanto los triángulos superior e inferior. Por ejemplo: correlation matrixTrazado solamente superior/triángulo inferior de un mapa de calor

El ejemplo anterior fue tomado de this site Por desgracia, no pude encontrar la manera de hacer esto en matplotlib. Establecer la parte superior/inferior de la matriz en Ninguno da como resultado un triángulo negro. He buscado en Google para "matplotlib valores perdidos", pero no pude encontrar nada útil

+1

Tal vez sólo photoshopped it :) Gracias por – endolith

Respuesta

16

el problema con la respuesta proporcionada por Doug es que se basa en el hecho de que los mapas mapa de colores los valores de cero a blanco. Esto significa que los mapas de color que no incluyen el color blanco no son útiles. La clave para la solución es la función cm.set_bad. Se enmascaran las partes innecesarias de la matriz con ninguno o con matrices NumPy enmascarados y set_bad al blanco, en lugar del negro por defecto. La adopción de ejemplo de Doug obtenemos lo siguiente:

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

¡agradable! también funciona con 'pcolormesh', que es para lo que necesitaba esta solución. También tenga en cuenta para excluir la diagonal así cambiar 'k = -1' a' k = 0' en la línea de 'máscara = 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

incluyendo sus importaciones. Los ejemplos ejecutables son muy útiles. – jcdyer

0

Con seaborn y numpy, una solución rápida es:

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) 

Por favor, se refieren a seaborn de documentos en línea para el maquillaje.

Cuestiones relacionadas