2017-07-13 7 views
2

私は最初にMatplotlibプロットにポイントを入力し、それらのポイントを使ってボロノイ図を作成するためのプログラムを作成したいと考えています。Matplotlibで入力したポイントをnp.arrayに渡すにはどうすればいいですか?

2つの部分から構成されていますが、接続ではありません。ユーザーが入力したポイントを渡して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_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()` 

ボロノイ図の作成:

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

あなたは同じプロットでそのボロノイ図やグラフを使用して新しいプロットを作成しますか? – ImportanceOfBeingErnest

+0

私はこの時点でそれについて本当に気にしません。それが同じプロットで可能な場合は素晴らしいだろうが、今は問題ではない。 –

答えて

2

クラスを使用して点を保存し、後で同じプロットで図をプロットすることができます。次の例では、マウスの左ボタンでポイントを置き、右クリックするとボロノイの図をプロットします。後でプロットに新しいポイントを追加したい場合は、それを行うことができます。

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

ありがとうございました!あなたは文字通り私の一日を救った。 –

1

をあなただけ保存することができますあなたのxyペアをリストに入れて後で配列に変換してください:

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

as lon gユーザーがプロットをクリックすると、ユーザーが元の図形を閉じるまでポイントがリストに追加されます。その後、新しい図形が作成され、Voronoiプロットが描画されます。お役に立てれば。

関連する問題