首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Mayavi points3d有不同的大小和颜色

Mayavi points3d有不同的大小和颜色
EN

Stack Overflow用户
提问于 2014-03-07 22:49:24
回答 3查看 8.4K关注 0票数 15

在mayavi中是否可以分别指定每个点的大小和颜色?

这个API对我来说很麻烦。

代码语言:javascript
复制
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)数组单独。

看起来很复杂?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-14 01:03:01

每个VTK源都有一个标量和向量的数据集。

我在我的程序中使用的使颜色和大小不同的技巧是绕过mayavi源,直接在VTK源中,使用标量表示颜色,使用矢量表示大小(它可能也是以另一种方式工作)。

代码语言:javascript
复制
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矢量数据,或者以某种方式移动矩阵维度。

票数 14
EN

Stack Overflow用户

发布于 2015-09-21 06:27:51

我同意Mayavi在这里提供的API令人不快。Mayavi documentation建议使用以下技巧(我稍微解释了一下)来独立调整点的大小和颜色。

代码语言:javascript
复制
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中的标量值来索引到颜色映射中。您可以选择提供一个固定大小的比例因子,该因子将应用于所有点。

这当然不是您所编写的最具自我文档化的代码,但它是有效的。

票数 9
EN

Stack Overflow用户

发布于 2017-04-13 05:32:07

我也同意API是丑陋的。我用@aestrivex的想法做了一个简单而完整的例子:

代码语言:javascript
复制
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()

这会产生:

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22253298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档