#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. Спасибо, сработало! Может быть, вы также можете ответить на второй вопрос?