python - 使用mlab在mayavi中用文本注释许多点

标签 python data-visualization mayavi

我正在尝试使用 mayavi.mlab 注释使用 points3d() 函数绘制的点。 每个点都与一个标签相关联,我想使用 text3d() 函数在这些点旁边绘制该标签。绘制点的速度很快,但是 mlab.text3d() 函数似乎不接受坐标数组,所以我必须遍历这些点并单独绘制文本,这非常慢:

        for i in xrange(0, self.n_labels):
            self.mlab_data.append(
                mlab.points3d( pX[self.labels == self.u_labels[i], 0],
                               pX[self.labels == self.u_labels[i], 1],
                               pX[self.labels == self.u_labels[i], 2],
                               color=self.colours[i],
                               opacity=1,
                               scale_mode="none",
                               scale_factor=sf ) )

            idcs, = np.where(self.labels == self.u_labels[i])
            for n in idcs.flatten():
                mlab.text3d( pX[n, 0],
                             pX[n, 1],
                             pX[n, 2],
                             "%d" % self.u_labels[i],
                             color=self.colours[i],
                             opacity=1,
                             scale=sf )

有什么办法可以加快速度吗?另外,是否可以添加图例(例如在 matplotlib 中),我在文档中找不到任何内容。

谢谢,

帕特里克

最佳答案

每次绘制点或文本时,您上面的操作方式都会渲染场景。这很慢。您可以禁用场景渲染,进行绘图,然后通过 figure.scene.disable_render = True/False 渲染场景:

    import scipy
    from mayavi import mlab

    X = 100 * scipy.rand(100, 3)
    figure = mlab.figure('myfig')
    figure.scene.disable_render = True # Super duper trick
    mlab.points3d(X[:,0], X[:,1], X[:,2], scale_factor=0.4)
    for i, x in enumerate(X):
        mlab.text3d(x[0], x[1], x[2], str(i), scale=(2, 2, 2))
    figure.scene.disable_render = False # Super duper trick

我在 morphic Viewer 的 Figure 类中使用了这个技巧和其他技巧 https://github.com/duanemalcolm/morphic/blob/master/morphic/viewer.py

代码中的另一个好技巧是重用现有对象,即,如果您已经绘制了文本,请不要重新绘制它们,只需更新它们的位置和文本属性。这意味着保存 mlab 对象。您可以在 morphic.Viewer 中看到我是如何做到这一点的。

关于python - 使用mlab在mayavi中用文本注释许多点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12935231/

相关文章:

Python Mayavi2 @mayavi2.standalone

python - mayavi 在表面上映射一个离散的颜色条

python - Tox 在安装模块时无法复制非 python 文件

r - 可视化以日期范围表示的时间范围数据

python - 使用 Mechanize (Python) 填写表格

javascript - JavaScript 中分散数据的等高线图

javascript - Protovis 和 JqPlot 性能

networkx - 将 Networkx 生成的 3D 图形保存为 VTK 格式,以便在 Paraview 中查看

python - Python 中的一行频率字典

python - 使用 Pyparse 将多个项目解析并组合在一起