在 window 和 scipy / voronoi_plot_2d 中重绘绘图

Redraw plot in same window with scipy / voronoi_plot_2d

我正在尝试在生成点改变位置时实时更新 Voronoi 图。

我的问题是如何重复使用相同的图形,因为目前我每次调用 voronoi_plot_2d 时都会得到一个新的 window。

见代码:

#!/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

指南中的代码可用于实现此目的。

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

我还没有时间通读并理解所有代码,但它 "manually" 可以满足我的要求并且可以正常工作。

而不是使用

voronoi_plot_2d(vor)

它一步一步使用vor的不同部分绘制voronoi图,这个可以在循环中重复。完整代码示例如下:

#!/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)