在 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)
我正在尝试在生成点改变位置时实时更新 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)