2017-07-13 4 views
2

Je souhaite créer un programme permettant à l'utilisateur d'entrer des points dans un graphe Matplotlib, puis de créer un diagramme de Voronoi en utilisant ces points.Comment transmettre des points que l'utilisateur a saisis dans Matplotlib vers un np.array?

Comprend les 2 parties, mais pas la connexion. Comment transmettre les points que l'utilisateur a saisis et l'utiliser dans la partie Voronoi? (J'ai juste besoin de savoir comment changer le points = np.random.rand(20,2) aux points entrée par l'utilisateur.)

modélisant les points:

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()` 

Création du Voronoi Schéma:

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() 
+0

Voulez-vous produire une nouvelle parcelle avec le diagramme de Voronoï ou de la parcelle que, dans la même parcelle? – ImportanceOfBeingErnest

+0

Je ne me soucie pas vraiment de ça en ce moment. Si c'est possible dans le même scénario, ce serait génial, mais ce n'est pas grave pour le moment. –

Répondre

2

Vous pouvez utiliser une classe pour stocker les points et ensuite tracer le diagramme dans ce même tracé. Dans l'exemple suivant, vous placez vos points avec le bouton gauche de la souris et tracez le diagramme de voronoi en cliquant sur le bouton droit de la souris. Si vous souhaitez ultérieurement ajouter de nouveaux points à l'intrigue, vous pouvez le faire.

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() 

enter image description here

+0

Merci beaucoup! Vous avez littéralement sauvé ma journée. –

1

Vous pouvez simplement sauver vos paires xy dans une liste et la convertir en un tableau plus tard:

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() 

Comme lon g lorsque l'utilisateur clique sur le tracé, des points sont ajoutés à la liste jusqu'à ce que l'utilisateur ferme la figure d'origine. Après cela, une nouvelle figure est créée et l'intrigue de Voronoï est dessinée. J'espère que cela t'aides.