Согласованные диапазоны данных / цветовой шкалы в Mayavi - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь повторить следующее в 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()

Это дает эту цифру: matplotlib construction

Для 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()

Однако, на самом деле это выглядит так:

mayavi construction

, который явно искажает исходный массив данных.

Кажется, что ключевые слова vmin и vmax в Mayavi imshow просто нормализуют данные к этим пределам, а не нормализуют цветовую карту к ним (как в matplotlib). Использование атрибута data_range цветовой шкалы Mayavi имеет аналогичный эффект. Есть идеи как обойти эту проблему?

...