Логарифмическая цветовая шкала контурного графика Python matplotlib

У меня проблемы с контурным графиком с использованием логарифмического масштабирования цвета. Я хочу указать уровни вручную. Однако Matplotlib рисует цветовую полосу странным образом — метки расположены неправильно, и отображается только один цвет. Идея основана на http://adversus.110mb.com/?cat=8.

Есть ли кто-нибудь там, кто может мне помочь? Я использую последнюю версию git-репозитория matplotlib, 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()

Большое спасибо за Вашу помощь! Он отлично работает, как вы предложили... Однако у меня есть другой вопрос: почему matplotlib не позволяет мне выбирать количество строк уровня в логарифмическом режиме:

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

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

Это была моя изначальная проблема...


person 7asd23hasd    schedule 21.04.2011    source источник


Ответы (2)


Так что это легко исправить; ваш порядок уровней означает, что самый низкий уровень рисуется последним и, следовательно, покрывает все! Пытаться:

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

вместо этого, и вы должны получить желаемый результат.

person jmetz    schedule 21.04.2011
comment
Спасибо, сработало! - Может быть, вы ответите и на второй вопрос? - person 7asd23hasd; 21.04.2011
comment
@ 45z23dsa: Похоже, что интервал в настройке LogNorm установлен на уровне 10 по основанию - поскольку данные снижаются только до ~ 1e-8, в итоге вы получаете ~ 8 уровней. Вы можете обойти это, изменив базу самостоятельно. Например. lev2 = np.arange(np.floor(np.log2(Z.min())-1), np.ceil(np.log2(Z.max())+1), за которым следует levs = np.power(2, lev_exp), даст вам базовые 2 разнесенных уровня, которые вы затем можете передать в качестве аргумента levels. Однако чтобы получить ровно, скажем, 20 уровней, нужно использовать нестандартную базу. - person jmetz; 22.04.2011
comment
Уважаемый mutzmatron, Спасибо за расследование! Так что, наверное, проще просто предоставить список уровней, которые я хочу... Так что я считаю оба вопроса решенными! - person 7asd23hasd; 24.04.2011

Похоже, levels ожидает увеличения значений. Попробуйте изменить их на: levels=[1e-3, 1e-2, 1e-1, 1e0] и посмотрите, решит ли это вашу проблему.

person Paul    schedule 21.04.2011
comment
Спасибо сработало! Может быть, вы также можете ответить на второй вопрос? - person 7asd23hasd; 21.04.2011