2012-06-11 16 views
9

que estoy tratando de hacer algo como se ve en la imagen es la siguiente, enter image description hereHacer diagonales inversas en blanco mapa de calor

sólo la creación diagonales inversas de color blanco que queda. No pude configurarlos como blancos. El gráfico toma valores enteros y no sé qué valor entero corresponde al color blanco.

¡Gracias!

Editado:

Este es el código;

import math 
from matplotlib import pyplot as plt 
from matplotlib import cm as cm 
import pylab 
import numpy as np 
from matplotlib.collections import LineCollection 

class HeatMap: 
    def __init__(self, selectedLines): 
     self.selectedLines = selectedLines 


    def getHeapMap(self): 
     figure = plt.figure() 

     if len(self.selectedLines) != 0: 

      self.map = self.createTestMapData(len(self.selectedLines),    len(self.selectedLines)) 


      maxValueInMap = self.findMaxValueInMap(self.map) 

      x = np.arange(maxValueInMap + 1) 
      ys = [x + i for i in x] 
      ax = figure.add_subplot(111) 
      ax.imshow(self.map, cmap=cm.jet, interpolation='nearest') 

      ''' 
      Left side label of the chart is created according to selected values 
      from a checkbox group. 
      ''' 
      leftSideLabelSize = len(self.selectedLines) 
      sideLabels = [] 
      for line in self.selectedLines: 
       sideLabels.append(line.text()) 
      pos = np.arange(leftSideLabelSize) 
      ''' 
      Left side labels are set with the code below. 
      ''' 
      pylab.yticks(pos, sideLabels) 
      plt.xticks(pos, sideLabels) 
      self.numrows, self.numcols = self.map.shape 
      ax.format_coord = self.format_coord 

      line_segments = LineCollection([zip(x, y) for y in ys], 
       linewidths=(0.5, 3, 1.5, 2), 
       linestyles='solid') 
      line_segments.set_array(x) 
      axcb = figure.colorbar(line_segments) 

     return figure 

    def format_coord(self, x, y): 
     col = int(x + 0.5) 
     row = int(y + 0.5) 
     if col >= 0 and col < self.numcols and row >= 0 and row < self.numrows: 
      z = self.map[row, col] 
      return 'x=%1.4f, y=%1.4f, z=%1.4f' % (x, y, z) 
     else: 
      return 'x=%1.4f, y=%1.4f' % (x, y) 

    def createTestMapData(self, xSize, ySize): 
     resultMap = 10 * np.random.rand(xSize, ySize) 
     #Setting reverse diagonal is here. Now it is set with zero but it gives blue. 
     # I want it to be set as white 
     for index in range(0, int(math.sqrt(resultMap.size))): 
      resultMap[index][((math.sqrt(resultMap.size) - 1) - index)] = 0 
     return resultMap 

    def findMaxValueInMap(self, map): 
     return np.amax(map) 

Los valores se generan aleatoriamente en este momento. El código está arriba da una GUI similar;

enter image description here

+0

¿Dibujó este a mano o lo codificó? Si es el último, ¿podemos ver el código? – Blender

+0

En realidad, lo escribí con ejemplos de la galería matplotlib. He editado la pregunta. –

Respuesta

8

Usted puede hacer su propio mapa de colores, o ajustar una existente :)

enter image description here

Aquí está el código para el gráfico de arriba, con explicaciones sobre los defectos en los comentarios:

import matplotlib 
from pylab import * 
import numpy as np 

#Create test data with zero valued diagonal: 
data = np.random.random_sample((25, 25)) 
rows, cols = np.indices((25,25)) 
data[np.diag(rows, k=0), np.diag(cols, k=0)] = 0 

#Create new colormap, with white for zero 
#(can also take RGB values, like (255,255,255): 
colors = [('white')] + [(cm.jet(i)) for i in xrange(1,256)] 
new_map = matplotlib.colors.LinearSegmentedColormap.from_list('new_map', colors, N=256) 

pcolor(data, cmap=new_map) 
colorbar() 
savefig('map.png') 
show() 

Alternativamente, podría ocultar sus datos y establecer un color de máscara:

#Create test data: 
data = np.random.random_sample((25, 25)) 
#Create a diagonal mask: 
mask = np.diag(np.ones(25)) 
#Apply mask to data: 
masked_data = ma.masked_array(data, mask) 
#Set mask color to white: 
cm.jet.set_bad(color='white', alpha=None) 
#for this to work we use pcolormesh instead of pcolor: 
pcolormesh(masked_data, cmap=cm.jet) 
colorbar() 
show() 

Esto produce esencialmente el mismo resultado, pero puede adaptarse a sus necesidades mejor que se puede establecer en cualquier celda de blanco, y también el blanco no aparece en la barra de colores (véase la parte inferior de la barra de colores más arriba):

enter image description here

+0

Puedes probarlo con 11 y 13 elementos. Hay un error, creo –

+0

@Whispered - ¿Qué va mal? Funciona bien para mí ... – fraxel

+0

La parte superior y el lado derecho se ven como blanco cuando hay 11 o 13 elementos. –

1

El mapa de colores se define por el argumento cmap en ax.imshow(). Has usado el mapa de colores jet para que tengas cmap=cm.jet, que es solo uno de muchos built-in color maps en matplotlib. Puede elegir uno o definir uno que se adapte a su gusto.

Cuestiones relacionadas