2012-06-11 6 views
9

Próbuję coś zrobić, jak widać na obrazie znajduje się poniżej, enter image description herezrobić Reverse przekątne biały w mapę cieplną

Wystarczy ustawienie odwrotne przekątnych biały kolor jest po lewej stronie. Nie mogłem ich ustawić jako białych. Wykres przyjmuje wartości całkowite i nie wiem, jaka wartość całkowita odpowiada białemu kolorowi.

Dziękujemy!

Zmieniano:

Oto kod;

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) 

Wartości są generowane losowo w danym momencie. Kod jest powyżej daje gui jak;

enter image description here

+0

Czy narysowałeś to ręcznie lub czy je zakodowałeś? Jeśli to drugie, czy możemy zobaczyć kod? – Blender

+0

Właściwie to napisałem to z przykładami galerii matplotlib. Zmieniłem to pytanie. –

Odpowiedz

8

Można stworzyć własną mapę kolorów lub dostosować istniejący :)

enter image description here

Oto kod na powyższym wykresie, z Wyjaśnienia w komentarzach:

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() 

Alternatywnie, możesz zamaskować swoje dane i ustawić kolor maski:

#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() 

To daje w zasadzie taki sam wynik, ale może lepiej dostosowane do potrzeb klientów, jak można ustawić dowolną komórkę do bieli, a także biały nie pojawi się na colorbar (patrz samo dno powyżej colorbar):

enter image description here

+0

Czy możesz spróbować z 11 i 13 elementów. Jest błąd myślę, że –

+0

@Whispered - Co poszło nie tak? To działa dobrze dla mnie .. – fraxel

+0

Górna i prawa strona są postrzegane jako białe, gdy jest 11 lub 13 elementów. –

1

mapie kolorów jest zdefiniowana przez cmap argumencie ax.imshow(). Zastosowałeś colormap jet, więc masz cmap=cm.jet, który jest jednym z wielu built-in color maps w matplotlib. Możesz wybrać jedną lub zdefiniować własną, która pasuje do Twojego gustu.