2011-04-21 11 views
8

Tengo problemas con una trama de contorno que usa escala de color logarítmica. Quiero especificar los niveles a mano. Matplotlib, sin embargo, dibuja la barra de color de una manera extraña: las etiquetas no están bien colocadas y solo aparece un color. La idea se basa en http://adversus.110mb.com/?cat=8Trama de contorno de matplotlib de Python escala de color logarítmica

¿Hay alguien por ahí que pueda ayudarme? Yo uso la versión más reciente matplotlib git-repositorio, v1.1.0 (2011-04-21)

import matplotlib.pyplot as plt 
import numpy as np 
from matplotlib.mlab import bivariate_normal 
from matplotlib.colors import LogNorm 
from matplotlib.backends.backend_pdf import PdfPages 


delta = 0.5 

x = np.arange(-3.0, 4.001, delta) 
y = np.arange(-4.0, 3.001, delta) 
X, Y = np.meshgrid(x, y) 
Z = bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) 

fig = plt.figure() 
ax = fig.add_subplot(1,1,1) 
#axim = ax.imshow(Z, norm = LogNorm()) 
axim = ax.contourf(X,Y,Z,levels=[1e0,1e-1,1e-2,1e-3],cmap=plt.cm.jet,norm = LogNorm()) 
cb = fig.colorbar(axim) 

pp = PdfPages('fig.pdf') 
pp.savefig() 
pp.close() 


plt.show() 

muchas gracias por su ayuda! Funciona perfecto, como usted sugiere ... Sin embargo, tengo otra pregunta: ¿Por qué matplotlib no me permite seleccionar el número de líneas de nivel en el modo logarítmico:

import matplotlib.pyplot as plt 
import numpy as np 
from matplotlib.mlab import bivariate_normal 
from matplotlib.colors import LogNorm 
from matplotlib.backends.backend_pdf import PdfPages 


delta = 0.5 

x = np.arange(-3.0, 4.001, delta) 
y = np.arange(-4.0, 3.001, delta) 
X, Y = np.meshgrid(x, y) 
Z = bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) 

fig = plt.figure() 
ax = fig.add_subplot(1,1,1) 
#axim = ax.imshow(Z, norm = LogNorm()) 
#axim = ax.contourf(X,Y,Z,levels=[1e-3,1e-2,1e-1,1e0],cmap=plt.cm.jet,norm = LogNorm()) 
axim = ax.contourf(X,Y,Z,20,cmap=plt.cm.jet,norm = LogNorm()) 
cb = fig.colorbar(axim) 

pp = PdfPages('fig.pdf') 
pp.savefig() 
pp.close() 


plt.show() 

http://i.stack.imgur.com/VeVFQ.png

Ésta era mi problema original ...

Respuesta

9

Por lo tanto, se puede arreglar fácilmente; ¡Su orden de niveles significa que el último nivel se dibuja al final y por lo tanto cubrió todo! Probar:

axim = ax.contourf(X,Y,Z,levels=[1e-3, 1e-2, 1e-1, 1e0],cmap=plt.cm.jet,norm = LogNorm()) 

lugar y usted debe obtener el resultado deseado.

+0

¡Gracias, trabajado! - ¿Quizás también puedas responder la segunda pregunta? – 7asd23hasd

+0

@ 45z23dsa: Parece que el espaciado en la configuración de LogNorm está establecido en la base 10 en los niveles: como los datos solo bajan a ~ 1e-8, terminas con ~ 8 niveles. Puede evitar esto cambiando la base usted mismo. P.ej. 'lev2 = np.arange (np.floor (np.log2 (Z.min()) - 1), np.ceil (np.log2 (Z.max()) + 1)' seguido de 'levs = np. power (2, lev_exp) 'le proporcionará una base de 2 niveles espaciados que luego puede pasar como el argumento de 'niveles'. Sin embargo, para obtener exactamente, digamos 20 niveles, necesita usar una base no estándar. – jmetz

+0

Estimado mutzmatron, ¡Gracias por investigar esto! Por lo tanto, probablemente sea más fácil simplemente proporcionar una lista de niveles que quiero ... ¡Por lo tanto, considero que ambas preguntas se han resuelto! – 7asd23hasd

2

Parece que levels espera que aumenten los valores. Intente cambiarlos a: levels=[1e-3, 1e-2, 1e-1, 1e0] y vea si eso resuelve su problema.

+0

¡Gracias! Tal vez también puede responder la segunda pregunta? – 7asd23hasd

Cuestiones relacionadas