前提・実現したいこと
matplotlibのキャンバス上をマウスでクリックすると点が追加されます。追加された点のx座標とy座標を用いてスプライン補完を行い、リアルタイムで点と点を結びたいです。
発生している問題・エラーメッセージ
ValueError: at least 2 breakpoints are needed
該当のソースコード
Python
1import matplotlib.pyplot as plt 2import numpy as np 3from scipy import interpolate 4 5def main(): 6 fig = plt.figure() 7 ClickAddPoints(fig).show() 8 9class ClickAddPoints: 10 def __init__(self, fig): 11 self.fig = fig 12 self.ax1 = fig.add_axes([0.1,0.1,0.8,0.8]) 13 self.xy = [] 14 self.points = self.ax1.scatter([], [], s=200, color='red', picker=10) 15 self.spline = interpolate.Akima1DInterpolator([],[]) 16 self.ax1.figure.canvas.mpl_connect('button_press_event', self.on_click) 17 18 def on_click(self, event): 19 if event.inaxes is not self.ax1: 20 return 21 self.xy.append([event.xdata, event.ydata]) 22 self.points.set_offsets(self.xy) 23 self.ax1.draw_artist(self.points) 24 self.ax1.figure.canvas.blit(self.ax1.bbox) 25 num = (len(self.xy)) 26 print(num) 27 if num > 2 : 28 self.spline.set_offsets(self.xy) 29 self.X = np.linspace(event.xdata[0], event.xdata[-1], num=100, endpoint=True) 30 self.Y = self.f(self.X) 31 plt.plot(self.X, self.Y) 32 else: 33 return 34 35 def show(self): 36 self.ax1.set_xticks(np.linspace(0, 4, 5)) 37 self.ax1.set_yticks(np.linspace(0, 4, 5)) 38 self.ax1.set_aspect('equal') 39 plt.show() 40 41main()
試したこと
プログラミング初心者です。書籍を読み調べたりしましたが有効な方法が見つかりません。このサイトの使用も初めてなので情報が至らなかったり、失礼があるかもしれませんがご了承ください。よろしくお願いします。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー