Построение 3D-точек с разными цветами в Mayavi (Python) - PullRequest
0 голосов
/ 19 января 2019

Есть ли какой-нибудь способ дать Mayavi список кортежей или, может быть, какой-нибудь обалденный массив размером number_of_points x 3, чтобы я мог указать разные цвета для каждой точки?

Итак, у меня есть следующие данные:

x размера Nx1 (содержит x координат из N точек)

y размера Nx1 (содержит y координат из N точек)

z размера Nx1 (содержит zкоординаты N точек)

R размера Nx1 (содержит значения для канала R из N точек)

G размера Nx1 (содержит значения для канала G из N точек)

B размера Nx1 (содержит значения для канала B из N точек)

Я хочу как-то передать эти RGB-данные в mayavi, чтобы он использовал фактический цвет точки, поэтому яхотел бы что-то вроде этого:

from mayavi import mlab
plt = mlab.points3d(x, y, z, color = (R, G, B))

Это работает, если N = 1, или с другими словами, только если я дал Mayavi одну точку, в противном случае это не так.Таким образом, я могу повторить его, но по какой-то причине он очень медленный и требует много памяти.

Я пробовал много вещей, но не могу найти ни одного подхода (кроме как сделать это впетля), которая делает то, что мне нужно.Есть идеи как это сделать?

1 Ответ

0 голосов
/ 19 января 2019

Одним из способов является помещение ваших RGB-массивов в таблицу поиска, которую вы затем указываете своему points3d объекту для использования. Например:

import numpy as np
import mayavi.mlab as mlab

# Fake data from:
# http://docs.enthought.com/mayavi/mayavi/auto/mlab_helper_functions.html#points3d
t = np.linspace(0, 2 * np.pi, 20)

x = np.sin(2 * t)
y = np.cos(t)
z = np.cos(2 * t)

# Create a [0..len(t)) index that we'll pass as 's'
s = np.arange(len(t))

# Create and populate lookup table (the integer index in s corresponding
#   to the point will be used as the row in the lookup table
lut = np.zeros((len(s), 4))

# A simple lookup table that transitions from red (at index 0) to
#   blue (at index len(data)-1)
for row in s:
    f = (row/len(s))
    lut[row,:] = [255*(1-f),0,255*f,255]

# Plot the points, update its lookup table
p3d = mlab.points3d(x, y, z, s, scale_mode='none')
p3d.module_manager.scalar_lut_manager.lut.number_of_colors = len(s)
p3d.module_manager.scalar_lut_manager.lut.table = lut

mlab.draw()
mlab.show()

Выдает

enter image description here

Справка:

...