mayavi是否可以单独指定每个点的大小和颜色?
那个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)
数组。
似乎很复杂?
答案 0 :(得分:12)
每个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矢量数据或以其他方式移动矩阵尺寸。
答案 1 :(得分:8)
我同意Mayavi在这里提供的API令人不快。 Mayavi documentation建议以下hack(我稍微解释过)来独立调整点的大小和颜色。
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
中的标量值来索引颜色映射。您可以选择提供一个恒定大小的比例因子,该因子将应用于所有点。
这肯定不是你写过的最自我编码的代码,但它确实有用。
答案 2 :(得分: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()
产生: