Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Центрировать цветовую карту вокруг 0 ​​в Mayavi

Автор вопроса: jmilloyОтветов: 2

Я рисую облако точек и раскрашиваю по остаточной ошибке. Я бы хотел, чтобы цветовая карта оставалась сосредоточенной на 0, чтобы ошибка 0 была белой.

Я вижу ответы для matplotlib. А как же Маяви?

from mayavi import mlab
mlab.points3d(x, y, z, e, colormap='RdBu')

pythoncolor-mappingmayavi

Ответы

Ответ 1 · рейтинг 1 · tmdavison

вы можете явно установить vmin и vmax цветовой карты с помощью mlab.points3d. Итак, вы можете просто убедиться, что vmin = -vmax. Что-то вроде этого:

mylimit = 10
mlab.points3d(x, y, z, e, colormap='RdBu',vmin=-mylimit,vmax=mylimit)

Или вы можете установить ограничение автоматически, например:

mylimit = max(abs(e.min()),abs(e.max()))

Ответ 2 · рейтинг 1 · Siyh

Если кто-то хочет сделать это, но так, чтобы использовалась вся цветовая полоса, вот решение, которое я сделал (с помощью здесь) для Mayavi, который растягивает цветовую полосу так, что ее центр находится на нуле:

#Mayavi surface
s = mlab.surf(data)
#Get the lut table of the data
lut = s.module_manager.scalar_lut_manager.lut.table.asarray()

maxd = np.max(data)
mind = np.min(data)
#Data range
dran = maxd - mind

#Proportion of the data range at which the centred value lies
zdp = abs(mind / dran)

#The +0.5's here are because floats are rounded down when converted to ints
#index equal portion of distance along colormap
cmzi = int(zdp * 255 + 0.5)
#linspace from zero to 128, with number of points matching portion to side of zero
topi = np.linspace(0, 127, cmzi) + 0.5
#and for other side
boti = np.linspace(128, 255, 255 - cmzi) + 0.5

#convert these linspaces to ints and map the new lut from these
shift_index = np.hstack([topi.astype(int), boti.astype(int)])
s.module_manager.scalar_lut_manager.lut.table = self.lut[shift_index]

#Force update of the figure now that we have changed the LUT
mlab.draw()

Обратите внимание, что если вы хотите сделать это несколько раз для одной и той же поверхности (т. е. если вы изменяете скаляры Mayavi, а не перерисовываете график), вам нужно сделать запись исходной таблицы lut и изменять ее каждый раз.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы