Я пытаюсь повторить следующее в Mayavi:
import numpy as np
import matplotlib.pyplot as plt
def gauss_2d(x,y,sx,sy,mx,my,rho):
a = 1./(2*np.pi*sx*sy*np.sqrt(1-rho**2))
b = 1./(2*(1-rho**2))
c = (x-mx)**2/sx**2
d = (y-my)**2/sy**2
e = (2*rho*(x-mx)*(y-my))/(sx*sy)
return a*np.exp(-b*(c+d-e))
plt.figure(figsize=(7,5))
x,y = np.meshgrid(np.linspace(0,10,1000),np.linspace(0,5,1000))
Z1 = gauss_2d(x,y,2,1,3,4,.25)
Z2 = 2*gauss_2d(x,y,2,4,10,1,.1)
Z = 10*(Z1-Z2)
cs = plt.imshow(Z, vmin=-1,vmax=1, cmap = plt.cm.tab20c)
plt.colorbar(cs)
plt.show()
Это дает эту цифру:
Для Mayavi аналогичный код должен быть:
from mayavi import mlab
import numpy as np
cs_obj = mlab.imshow(Z, colormap = 'Vega20c', vmin=-1, vmax=1)
cb = mlab.colorbar(cs_obj, orientation='vertical', nb_labels=5)
#cb.data_range =(-1,1)
mlab.show()
Однако, на самом деле это выглядит так:
, который явно искажает исходный массив данных.
Кажется, что ключевые слова vmin
и vmax
в Mayavi imshow
просто нормализуют данные к этим пределам, а не нормализуют цветовую карту к ним (как в matplotlib). Использование атрибута data_range
цветовой шкалы Mayavi имеет аналогичный эффект. Есть идеи как обойти эту проблему?