2012-07-25 14 views
6

Debo admitir que comprender cómo crear o manipular los mapas de color de matplotlib no es una tarea fácil. Por lo tanto, estoy buscando un poco de ayuda para explicar y configurar un mapa de colores que va del azul (negativo) al rojo (positivo) y tiene el blanco centrado alrededor de cero. Después me gustaría utilizar este CMAP en contourf:Crear un mapa de color con blanco centrado alrededor de cero

  1. Esto funciona, pero los colores se invierten

    cs = plt.contourf(longrid, latgrid, 
            ar[window-1]-bkgrd, levels, 
            cmap = cm.get_cmap('BuRd', len(levels)-1)) 
    
  2. El problema aquí es que BuRd_r quita el blanco alrededor de cero

    cs = plt.contourf(longrid, latgrid, 
            ar[window-1]-bkgrd, levels, 
            cmap = cm.get_cmap('BuRd_r', len(levels)-1)) 
    

Agradeceria cualquier ayuda con esto.

Aquí está la función y los datos para probar el mapa de colores:

def PlotAnomalyCF(ar,hgrid,latgrid,longrid,outfile,levels,units):       
    window = 1                   
    tsize = 8                    
    plt.close()                   
    plt.figure(figsize=(11.7,4.3))              
    plt.clf()                    
    plt.cla()                    

    bkgrd = bn.nanmean(ar[:],0) 

    for v in hgrid:OA                  
     plt.subplot(1,len(hgrid),window)             
     plt.title(v,fontsize=tsize)              
     plt.subplots_adjust(left=0.07,bottom=0.75,          
          right=0.98, top=0.92,           
          wspace=0.12,hspace=0.98)          
     cs = plt.contourf(longrid,latgrid,            
          ar[window-1]-bkgrd,levels,          
          cmap=cm.get_cmap('BuRd_r',len(levels)-1))      
     cs.cmap.set_over('r')                
     plt.grid(True)                 
     plt.axis('off')                 
     window += 1                  
    ax = plt.gca()                  
    pos = ax.get_position()                
    l,b,w,h = pos.bounds                 
    print l,b,w,h                   
    cax = plt.axes([l-0.848,b-0.05,0.91,0.02]) # setup colorbar axes      
    cbar = plt.colorbar(cs,cax=cax,orientation='horizontal')        
    cl = plt.getp(cbar.ax, 'xticklabels')             
    plt.setp(cl, fontsize=8) 
    # Add units text                  
    plt.figtext(0.012,0.83,units,fontsize=tsize+1)          
    print 'outfile.',outfile                
    plt.savefig(outfile,dpi=900,orientation='landscape',format='pdf')      
    plt.show() 

# Data 
hgrid = array([-18, -15, -12, -9, -6, -3, 0, 3, 6, 9, 12, 15, 18]) 
latgrid = array([ 5.61402391, 4.91227095, 4.21051798, 3.508765 , 2.80701201, 
        2.10525902, 1.40350602, 0.70175301, 0.  , -0.70175302, 
       -1.40350604, -2.10525907, -2.8070121 , -3.50876514, -4.21051818, 
       -4.91227122, -5.61402427]) 
longrid = array([-5.625 , -4.921875, -4.21875 , -3.515625, -2.8125 , -2.109375, 
       -1.40625 , -0.703125, 0.  , 0.703125, 1.40625 , 2.109375, 
       2.8125 , 3.515625, 4.21875 , 4.921875, 5.625 ]) 
levels = array([-20, -19, -18, -17, -16, -15, -14, -13, -12, -11, -10, -9, -8, 
       -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 
       6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 
       19, 20]) 
units ='$\mathrm{CC_{200}\,[\%]}$' 
ar = shape is (13, 17, 17) with max = 82.4 and min = 45.5. It would be easier to just 
    generate some random data within these intervals. Alternatively just copy one of the 
    array: 
ar[1] = array([[ 46.91224792, 46.21374984, 46.86130719, 47.01021234, 
    46.72626813, 46.2288305 , 46.43835451, 45.79325437, 
    45.58271668, 46.35872217, 48.08725987, 48.44553638, 
    47.76519316, 47.6366742 , 48.40425078, 48.77756577, 
    49.33566712], 
    [ 46.83599932, 46.84286989, 47.33453309, 46.55030976, 
    46.80566458, 46.53292035, 47.02261763, 47.41084421, 
    47.38724565, 47.91122826, 49.21117552, 49.45223641, 
    49.97629913, 50.44165439, 51.08080398, 50.79600723, 49.968034 ], 
    [ 47.42288313, 47.07674124, 46.7167639 , 46.11959218, 
    46.95814111, 46.88763807, 47.79510368, 48.50213272, 
    49.14340301, 50.0550682 , 50.96554707, 51.70960776, 
    52.76304827, 53.13428506, 53.01955687, 52.57951586, 
    51.91245273], 
    [ 47.71067291, 47.48154219, 47.40131211, 47.45929857, 
    48.46118424, 48.65199823, 49.38156691, 49.86137507, 
    50.55394084, 51.96604309, 52.60579898, 53.69096203, 
    54.22750101, 54.37757099, 54.31517398, 53.47697773, 
    53.41809044], 
    [ 48.20779565, 48.58856851, 48.75880829, 49.40822878, 
    50.03355014, 51.44922083, 52.00567831, 52.99485667, 
    53.69339127, 53.58208129, 53.88588998, 55.24096208, 
    55.24137628, 55.38338399, 55.30856415, 55.0329081 , 
    54.58041914], 
    [ 49.20063728, 49.81223264, 50.2145489 , 50.54749112, 
    51.44252761, 53.1708726 , 54.48141824, 55.1337493 , 
    55.86338227, 55.80719304, 56.1060897 , 56.15050406, 
    56.10404113, 56.82550383, 57.12370494, 56.79250814, 
    57.21656741], 
    [ 50.17222332, 50.78494993, 51.47036476, 51.78513471, 
    54.07329312, 55.12136894, 56.63202678, 56.77587861, 
    57.60688855, 57.31874243, 57.86532727, 58.38753463, 
    58.52204736, 58.8451274 , 59.17282185, 58.93137673, 
    58.90977463], 
    [ 51.50642331, 51.51055372, 52.44746806, 53.37696513, 
    54.86775802, 56.68992167, 57.90624404, 58.76394172, 
    59.64662899, 59.80540837, 59.98355254, 60.05761821, 
    59.95848562, 60.54540623, 60.4776266 , 60.11749116, 
    59.74209418], 
    [ 51.40396463, 51.48043239, 52.89530187, 53.73500868, 
    55.39612502, 56.70178532, 58.07064267, 59.56644298, 
    60.47288049, 60.59095081, 61.26474813, 61.20278944, 
    61.43807574, 61.1942828 , 60.40014922, 59.78371327, 
    59.50410992], 
    [ 51.89656984, 52.18725649, 52.57764233, 54.39502415, 
    55.61672911, 57.04180061, 58.54357871, 59.76354498, 
    60.24155861, 60.59473182, 60.65985503, 60.92762915, 
    60.76726905, 60.47166256, 60.42044548, 60.04043031, 
    60.06031171], 
    [ 51.69698671, 52.39494994, 52.71685017, 53.65488505, 
    54.52480831, 56.33091376, 57.87811829, 58.36719736, 
    59.31479758, 59.61329074, 59.81807224, 59.44053305, 
    59.25522337, 59.5309563 , 59.68850776, 59.54046914, 
    58.60604327], 
    [ 50.81523448, 51.5690217 , 51.81382216, 52.88514118, 
    53.27394887, 54.6941369 , 55.81938471, 56.85401174, 
    57.10874072, 58.55074569, 58.45869901, 57.67496274, 
    57.3895956 , 58.05319653, 58.83009123, 57.90678384, 
    56.97717781], 
    [ 49.61355365, 49.92298625, 50.56281781, 51.22117266, 
    51.98020374, 53.0328832 , 53.76602714, 54.94396421, 
    55.16849545, 55.83033544, 56.19720112, 56.9382048 , 
    57.20669361, 56.76351885, 56.93632305, 56.16428665, 54.7570241 ], 
    [ 49.17250426, 49.14663096, 49.86504335, 50.24394193, 
    50.84671744, 51.21785439, 51.72667942, 52.8287256 , 
    53.65550669, 53.81801262, 54.62490542, 54.88045696, 
    55.27367041, 54.89234901, 54.51005786, 53.57284022, 
    52.53966996], 
    [ 48.55125023, 48.99467099, 49.80237362, 49.67943854, 
    49.45569362, 49.3387854 , 50.129718 , 49.94784906, 
    51.03357894, 51.73021167, 52.0211617 , 52.55805334, 
    52.22956095, 51.88844202, 50.87410618, 50.39506101, 
    49.72117909], 
    [ 48.37551433, 48.30812683, 48.45300884, 48.50818535, 
    47.76798967, 47.21965588, 47.60764424, 48.21327283, 
    48.52370448, 49.95221655, 49.7608777 , 50.1178807 , 
    50.15020093, 49.4369175 , 49.16839811, 49.31254753, 
    48.03208233], 
    [ 46.91675497, 46.45280928, 46.37122283, 46.69881125, 
    45.95493853, 46.33296801, 46.15091804, 46.09862998, 
    46.31676066, 46.6199912 , 47.60040926, 48.34096053, 
    47.78005438, 48.0951173 , 48.15291404, 47.21140107, 
    46.28884057]]) 

Respuesta

10

lugar de utilizar un CMAP de valores, voy a caminar a fondo la producción de su propio.

Como ya ha detectado, con el fin de tener un control absoluto de los colores (sin pasar a una matriz de colores) cuando se utiliza MC, el número de colores en un CMAP debe ser igual al número de niveles - 1.

Podemos demostrarlo fácilmente con el siguiente ejemplo. Vamos a hacer un mapa de colores con los tres colores primarios en:

import matplotlib.pyplot as plt 
import matplotlib.colors as mcolors 
import numpy 


data = numpy.arange(12).reshape(3, 4) 

cmap = mcolors.ListedColormap([(0, 0, 1), 
           (0, 1, 0), 
           (1, 0, 0)]) 

Sin embargo, cuando llegamos a usar esto con otra de 3 + 1 niveles de nada, vamos a obtener resultados que no se puede esperar:

plt.subplot(121) 
plt.contourf(data, cmap=cmap, levels=[1, 4, 8, 10]) 

plt.subplot(122) 
plt.contourf(data, cmap=cmap, levels=[1, 4, 8]) 

plt.show() 

enter image description here

Así que han demostrado que los niveles deben ser de longitud n_colors-1, sino porque queremos tener 3 colores y el color medio siempre se muestra, también debe tener un número par de niveles.

Bueno, ahora tenemos algunas reglas básicas, vamos a hacer una LinearSegmentedColormap que es esencialmente sólo un ListedColormap con interpolación de N colores:

levs = range(12) 
assert len(levs) % 2 == 0, 'N levels must be even.' 

cmap = mcolors.LinearSegmentedColormap.from_list(name='red_white_blue', 
               colors =[(0, 0, 1), 
                  (1, 1., 1), 
                  (1, 0, 0)], 
               N=len(levs)-1, 
               ) 
plt.contourf(data, cmap=cmap, levels=levs) 
plt.show() 

enter image description here

podemos verificar que la CMAP normailzed tiene blanco como el color medio programáticamente:

>>> print cmap(0.5) 
(1.0, 1.0, 1.0, 1.0) 

Esperemos que esto le dará toda la información que necesita para ser capaz de hacer cualquier mapa de colores que te guste y usarlo con éxito en el contorno.

+0

gracias! Esto realmente ayuda. Creará mi propio mapa de colores a partir de esta introducción. – Shejo284

Cuestiones relacionadas