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

#python #matplotlib #plot #logging #contour

#python #matplotlib #график #ведение журнала #контур

Вопрос:

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

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

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

Это была моя первоначальная проблема…

Ответ №1:

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

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

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

Комментарии:

1. Спасибо, сработало! — Может быть, вы также можете ответить на второй вопрос?

2. @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 уровней, вам нужно использовать нестандартную базу.

3. Дорогой mutzmatron, спасибо вам за расследование этого! Поэтому, вероятно, проще просто предоставить список уровней, которые я хочу… Итак, я считаю, что оба вопроса решаемы!

Ответ №2:

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

Комментарии:

1. Спасибо, сработало! Может быть, вы также можете ответить на второй вопрос?