我正在尝试使用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中),我在文档中找不到任何东西。
谢谢,
帕特里克
每次绘制点或文本时,您的执行方式都会呈现场景。这很慢。您可以禁用场景渲染,进行绘图,然后通过 fige.scene.disable_render = true/fals/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
我在形态查看器中的图类中使用此技巧,其他技巧https://github.com/duanemalcolm/morphic/morphic/blob/master/morstar/morphic/morphic/viewer.py.py
代码中的另一个好窍门是重复使用现有对象,即,如果您已经绘制了文本,请不要重新使用它们,只需更新其位置和文本属性即可。这意味着保存MLAB对象。您可以在Morphic.Viewer中看到我如何做到这一点。