Подтвердить что ты не робот

Mayavi points3d с разным размером и цветами

Возможно ли в майави указать индивидуально как размер, так и цвета каждой точки?

Этот API для меня громоздкий.

points3d(x, y, z...)
points3d(x, y, z, s, ...)
points3d(x, y, z, f, ...)

x, y and z are numpy arrays, or lists, all of the same shape, giving the positions of the points.
If only 3 arrays x, y, z are given, all the points are drawn with the same size and color.
In addition, you can pass a fourth array s of the same shape as x, y, and z giving an associated scalar value for each point, or a function f(x, y, z) returning the scalar value. This scalar value can be used to modulate the color and the size of the points.

Таким образом, в этом случае скаляр контролирует как размер, так и цвет, и невозможно распутать их. Я хочу, чтобы указать размер как массив (N,1) и цвет как другой массив (N,1).

Кажется сложным?

4b9b3361

Ответ 1

Каждый источник VTK имеет набор данных для скаляров и векторов.

Хитрость, которую я использую в своей программе для получения цвета и размера, состоит в том, чтобы обойти источник mayavi и непосредственно в источнике VTK, использовать скаляры для цвета и векторы для размера (возможно, это работает и наоборот).

nodes = points3d(x,y,z)
nodes.glyph.scale_mode = 'scale_by_vector'

#this sets the vectors to be a 3x5000 vector showing some random scalars
nodes.mlab_source.dataset.point_data.vectors = np.tile( np.random.random((5000,)), (3,1))

nodes.mlab_source.dataset.point_data.scalars = np.random.random((5000,))

Возможно, вам придется транспонировать векторные данные 5000x3 или каким-либо другим образом изменить размеры матрицы.

enter image description here

Ответ 2

Я согласен с тем, что API, который предоставляет Mayavi здесь, неприятен. Документация Mayavi предлагает следующий взлом (который я немного перефразировал), чтобы независимо настроить размер и цвет точек.

pts = mayavi.mlab.quiver3d(x, y, z, sx, sy, sz, scalars=c, mode="sphere", scale_factor=f)
pts.glyph.color_mode = "color_by_scalar"
pts.glyph.glyph_source.glyph_source.center = [0,0,0]

Это отобразит x,y,z точки в виде сфер, даже если вы вызываете mayavi.mlab.quiver3d. Mayavi будет использовать норму векторов sx,sy,sz, чтобы определить размер точек, и будет использовать скалярные значения в c для индексации в цветовой карте. Вы можете дополнительно указать коэффициент масштабирования по постоянному размеру, который будет применяться ко всем точкам.

Это, конечно, не самый самодокументирующий код, который вы когда-либо будете писать, но он работает.

Ответ 3

Я также согласен с тем, что API уродлив. Я просто сделал простой и полный пример с использованием идеи @aestrivex:

from mayavi.mlab import *
import numpy as np

K = 10
xx = np.arange(0, K, 1)
yy = np.arange(0, K, 1)

x, y = np.meshgrid(xx, yy)
x, y = x.flatten(), y.flatten()
z = np.zeros(K*K)

colors = 1.0 * (x + y)/(max(x)+max(y))

nodes = points3d(x, y, z, scale_factor=0.5)
nodes.glyph.scale_mode = 'scale_by_vector'

nodes.mlab_source.dataset.point_data.scalars = colors

show()

который производит:

введите описание изображения здесь