matplotlibのキャンバス上をマウスでクリックし、追加された点をスプライン補完するコードです。点を1つ追加あるいは1つ削除した際、表示される線を最新のもののみにしたいのですが、上手くいきません。
Python
1import matplotlib.pyplot as plt 2import numpy as np 3from scipy import interpolate 4 5 6def main(): 7 fig = plt.figure() 8 ClickAddPoints(fig).show() 9 10 11class ClickAddPoints: 12 def __init__(self, fig): 13 self.fig = fig 14 self.ax1 = fig.add_axes([0.1, 0.1, 0.8, 0.8]) 15 self.x = [] 16 self.y = [] 17 self.xy = [] 18 self.points = self.ax1.scatter([], [], s=10, color='red', picker=100) 19 self.ax1.figure.canvas.mpl_connect('button_press_event', self.on_click) 20 self.ax1.figure.canvas.mpl_connect('key_press_event', self.on_key) 21 self.counter = 0 22 23 def calc_spline(self, x, y, point, deg): 24 tck, u = interpolate.splprep([x, y], k=deg, s=0) 25 u = np.linspace(0,1, num=point, endpoint=True) 26 spline = interpolate.splev(u, tck) 27 return spline[0], spline[1] 28 29 def remove_points(self): 30 self.xy.pop() 31 32 def update_plot(self): 33 self.ax1.figure.canvas.draw() 34 35 def on_click(self, event): 36 if event.button == 1: 37 # 前の線をクリアする場合は下の行をコメントアウトする。 38 # plt.cla() 39 if event.inaxes is not self.ax1: 40 return 41 42 self.x.append([event.xdata]) 43 self.y.append([event.ydata]) 44 self.xy.append([event.xdata, event.ydata]) 45 self.points.set_offsets(self.xy) 46 self.ax1.draw_artist(self.points) 47 self.ax1.figure.canvas.blit(self.ax1.bbox) 48 49 if 1 < len(self.xy) <= 2: 50 51 #self.xy.sort() 52 self.xx = [t[0] for t in self.xy] 53 self.yy = [t[1] for t in self.xy] 54 x1, y1 = self.calc_spline(self.xx, self.yy, 1000, 1) 55 plt.plot(x1, y1) 56 self.show() 57 self.update_plot() 58 elif 2 < len(self.xy) <= 3: 59 self.xx = [t[0] for t in self.xy] 60 self.yy = [t[1] for t in self.xy] 61 x1, y1 = self.calc_spline(self.xx, self.yy, 1000, 2) 62 plt.plot(x1, y1) 63 self.show() 64 self.update_plot() 65 elif len(self.xy) >= 4: 66 self.xx = [t[0] for t in self.xy] 67 self.yy = [t[1] for t in self.xy] 68 x1, y1 = self.calc_spline(self.xx, self.yy, 1000, 3) 69 plt.plot(x1, y1) 70 self.show() 71 self.update_plot() 72 else: 73 return 74 elif event.button == 3: 75 self.remove_points() 76 self.update_plot() 77 self.counter += 1 78 print('Count:{0}'.format(self.counter)) 79 80 81 82 def show(self): 83 self.ax1.set_xticks(np.linspace(0, 4, 5)) 84 self.ax1.set_yticks(np.linspace(0, 4, 5)) 85 self.ax1.set_aspect('equal') 86 plt.show() 87 88 def on_key(self, event): 89 if event.key == 'q': 90 return 91 92 93main()
plt.cfl()を追加しましたが、グラフがすべて削除されたのち、新しく点を打つことはできませんでした。
plt.cla()を使用した場合は意図しない場所に点が打たさりました。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/01 03:33