2015-05-22 3 views
1

Я пытаюсь обновить график в Voronoi в реальном времени, поскольку положение точек смены точек.Перерисовать участок в том же окне с scipy/voronoi_plot_2d

Моя проблема заключается в том, как повторно использовать одну и ту же фигуру, так как в настоящее время я получаю новое окно каждый раз, когда я вызываю voronoi_plot_2d.

См код:

#!/usr/bin/env python 

import numpy as np 
import time 
from scipy.spatial import Voronoi, voronoi_plot_2d 
import matplotlib.pyplot as plt 


plt.ion() 
(x,y) = (1,2) 
plt.show() 


while True: 
    print "loop " 
    x += 0.1 
    y += 0.1 
    points = np.array([[0, 0], [1, 3], [0, 2.5], [x,y], [4, 1], [6, 4]]) 
    vor = Voronoi(points) 
    apa = voronoi_plot_2d(vor) 
    time.sleep(0.5) 

Я получил некоторые идеи для этого из

http://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.spatial.Voronoi.html

real-time plotting in while loop with matplotlib

ответ

1

Код в руководстве могут быть использованы достигнуть этого.

http://docs.scipy.org/doc/scipy/reference/tutorial/spatial.html

Я еще не успел прочитать и понять весь код, но это «вручную» делает то, что я хочу, и это работает.

Вместо использования

voronoi_plot_2d(vor) 

Это шаг за шагом использует различные части VOR для построения Вороного участок, и это может повторяться в цикле. Полный пример кода ниже:

#!/usr/bin/env python 

import numpy as np 
import time 
from scipy.spatial import Voronoi, voronoi_plot_2d 
import matplotlib.pyplot as plt 


plt.ion() 
(x,y) = (1,2) 
plt.draw() 


while True: 
    print "loop " 
    x += 0.1 
    y += 0.1 
    points = np.array([[0, 0], [1, 3], [0, 2.5], [x,y], [4, 1], [6, 4]]) 
    plt.clf() 
    vor = Voronoi(points) 

####MANUAL PLOTTING 

    plt.plot(points[:,0], points[:,1], 'o') 
    plt.plot(vor.vertices[:,0], vor.vertices[:,1], '*') 
    plt.xlim(-1, 3); plt.ylim(-1, 3) 


    for simplex in vor.ridge_vertices: 
     simplex = np.asarray(simplex) 
     if np.all(simplex >= 0): 
      plt.plot(vor.vertices[simplex,0], vor.vertices[simplex,1], 'k-') 

    center = points.mean(axis=0) 
    for pointidx, simplex in zip(vor.ridge_points, vor.ridge_vertices): 
     simplex = np.asarray(simplex) 
     if np.any(simplex < 0): 
      i = simplex[simplex >= 0][0] # finite end Voronoi vertex 
      t = points[pointidx[1]] - points[pointidx[0]] # tangent 
      t /= np.linalg.norm(t) 
      n = np.array([-t[1], t[0]]) # normal 
      midpoint = points[pointidx].mean(axis=0) 
      far_point = vor.vertices[i] + np.sign(np.dot(midpoint - center, n)) * n * 100 
      plt.plot([vor.vertices[i,0], far_point[0]], [vor.vertices[i,1], far_point[1]], 'k--') 
    plt.draw() 
    time.sleep(0.5) 
Смежные вопросы