Python 如何将用户在Matplotlib中输入的点传递到np.array?
我想创建一个程序,允许用户首先在Matplotlib图中输入点,然后使用这些点创建Voronoi图 找到了两个部分,但没有找到连接。如何传递用户输入的点并在Voronoi部件中使用?(我只需要知道如何将Python 如何将用户在Matplotlib中输入的点传递到np.array?,python,numpy,matplotlib,scipy,voronoi,Python,Numpy,Matplotlib,Scipy,Voronoi,我想创建一个程序,允许用户首先在Matplotlib图中输入点,然后使用这些点创建Voronoi图 找到了两个部分,但没有找到连接。如何传递用户输入的点并在Voronoi部件中使用?(我只需要知道如何将points=np.random.rand(20,2)更改为用户输入的点。) 绘制点: import matplotlib.pyplot as plt fig = plt.figure() ax = fig.add_subplot(111) ax.set_xlim([0, 10]) ax.set
points=np.random.rand(20,2)
更改为用户输入的点。)
绘制点:
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_xlim([0, 10])
ax.set_ylim([0, 10])
def onclick(event):
print('x=%d, y=%d, xdata=%f, ydata=%f' %
(event.x, event.y, event.xdata, event.ydata))
plt.plot(event.xdata, event.ydata, 'bo')
fig.canvas.draw()
cid = fig.canvas.mpl_connect('button_press_event', onclick)
plt.show()`
创建Voronoi图:
import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial import Voronoi, voronoi_plot_2d
fig = plt.figure()
points = np.random.rand(20,2)
vor = Voronoi(points)
voronoi_plot_2d(vor)
plt.show()
您只需将x-y对保存在列表中,然后将其转换为数组:
import matplotlib.pyplot as plt
import numpy as np
from scipy.spatial import Voronoi, voronoi_plot_2d
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_xlim([0, 10])
ax.set_ylim([0, 10])
points = []
def onclick(event):
print('x=%d, y=%d, xdata=%f, ydata=%f' %
(event.x, event.y, event.xdata, event.ydata))
points.append([event.xdata,event.ydata])
plt.plot(event.xdata, event.ydata, 'bo')
fig.canvas.draw()
cid = fig.canvas.mpl_connect('button_press_event', onclick)
plt.show()
fig2 = plt.figure()
vor = Voronoi(np.array(points))
voronoi_plot_2d(vor)
plt.show()
只要用户在绘图中单击,点就会添加到列表中,直到用户关闭原始图形。然后创建新图形并绘制Voronoi绘图。希望这有帮助。您可以使用一个类来存储点,然后在同一个绘图中绘制图表。在下面的示例中,使用鼠标左键放置点,然后单击鼠标右键绘制voronoi图。如果以后要向绘图添加新点,可以这样做
import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial import Voronoi, voronoi_plot_2d
fig, ax = plt.subplots()
ax.set_xlim([0, 10])
ax.set_ylim([0, 10])
class V():
def __init__(self, ax = None):
self.ax = ax
if not self.ax: self.ax = plt.gca()
tx = "left click to place points\nright click to plot voronoi diagram"
self.text = self.ax.text(0.1,0.9, tx, transform=self.ax.transAxes,
ha="left", va="top")
self.cid = fig.canvas.mpl_connect('button_press_event', self.onclick)
self.points = []
def onclick(self, event):
self.text.set_visible(False)
if event.button == 1:
print('x=%d, y=%d, xdata=%f, ydata=%f' %
(event.x, event.y, event.xdata, event.ydata))
plt.plot(event.xdata, event.ydata, 'bo')
self.points.append((event.xdata, event.ydata))
else:
self.voronoi()
fig.canvas.draw()
def voronoi(self):
self.ax.clear()
vor = Voronoi(self.points)
voronoi_plot_2d(vor, ax=self.ax)
v = V(ax=ax)
plt.show()
您想用voronoi图生成一个新的绘图还是在同一个绘图中绘制?我现在不太关心这个问题。如果能在同一个情节中出现,那就太棒了,但现在没关系。非常感谢!你真的救了我一天。