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 ...
¡Gracias, trabajado! - ¿Quizás también puedas responder la segunda pregunta? – 7asd23hasd
@ 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
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