2012-10-17 35 views
6

Tôi đang cố chú thích các điểm được vẽ bằng hàm points3d() sử dụng mayavi.mlab. Mỗi điểm được liên kết với một nhãn mà tôi muốn vẽ bên cạnh các điểm bằng cách sử dụng hàm text3d(). Vẽ các điểm là nhanh chóng, tuy nhiên mlab.text3d() chức năng dường như không chấp nhận mảng tọa độ, vì vậy tôi phải vòng qua các điểm và cốt truyện văn bản riêng lẻ, mà là rất chậm:chú thích nhiều điểm với văn bản trong mayavi bằng cách sử dụng mlab

 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) 

Bất kỳ ý tưởng làm thế nào tôi có thể tăng tốc độ này lên? Ngoài ra, là nó có thể thêm một huyền thoại (như ví dụ trong matplotlib), tôi không thể tìm thấy bất cứ điều gì trong các tài liệu.

Cảm ơn,

Patrick

Trả lời

5

Cách bạn đang làm nó ở trên sẽ làm cho cảnh mỗi khi bạn vẽ một điểm hoặc văn bản. Đây là chậm. Bạn có thể vô hiệu hóa các cảnh render, làm âm mưu và sau đó làm cho cảnh bởi 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 

tôi sử dụng thủ thuật này và những người khác trong hình lớp trong hình thái Viewer https://github.com/duanemalcolm/morphic/blob/master/morphic/viewer.py

Một mẹo hay khác trong mã là sử dụng lại các đối tượng hiện có, tức là nếu bạn đã vẽ văn bản, đừng thay thế chúng, chỉ cập nhật vị trí và thuộc tính văn bản của chúng. Điều này có nghĩa là lưu đối tượng mlab. Bạn có thể thấy cách tôi làm điều này trong morphic.Viewer.

Các vấn đề liên quan