Sliderの話
こんにちは、たくさん寝太郎です。
来週は人工知能学会があるのでゼミが休みです。
kaworu-mk6.hatenablog.com
さて、今日は先日記事にした「エーレンフェストの壺の話」のレポートを書いていたのですが、途中で「これnの数をスライドで動かせるようにしたいなぁ」と思ったので出来ないか調べてみました。
matplotlib.widgetsにSliderというものがあり、それで出来そうだったので試してみました。
import matplotlib.pyplot as plt import numpy as np from matplotlib.widgets import Slider x = np.arange(-np.pi,np.pi,0.1) y = np.sin(x) fig,ax = plt.subplots() plt.subplots_adjust(left=0.1,bottom=0.15) graph, = plt.plot(x,y) plt.title('y=sin(x+theta)') def threshold_update(slider_val): y = np.sin(x+slider_val) # xとyの値を更新 graph.set_xdata(x) graph.set_ydata(y) # グラフの再描画 fig.canvas.draw_idle() # スライダーの表示位置 slider_pos = plt.axes([0.1, 0.01, 0.8, 0.03]) # Sliderオブジェクトのインスタンス作成 threshold_slider = Slider(slider_pos, 'theta=', 0, 2*np.pi, valinit=0) # スライダーの値が変更された場合の処理を呼び出し threshold_slider.on_changed(threshold_update) plt.show()
Sliderの使い方はこんな感じらしいです。
sin(x+theta)のthetaを動かしてみました。
これを先日のエーレンフェストの壺でやってみると次のようになります。
import random import matplotlib.pyplot as plt from matplotlib.widgets import Slider N = 1000 n = 200 ball_list = [i+1 for i in range(N)] random.shuffle(ball_list) def lb_balls(n): left_box = ball_list[0:n] lb_num_balls = [n] for i in range(10000): r = random.randint(1,N) if r in left_box: left_box.remove(r) lb_num_balls.append(len(left_box)) else: left_box.append(r) lb_num_balls.append(len(left_box)) return lb_num_balls fig,ax = plt.subplots() plt.subplots_adjust(left=0.25, bottom=0.25) lb_num_balls = lb_balls(n) graph, = plt.plot(lb_num_balls) plt.ylim(0,1000) def threshold_update(slider_val): lb_num_balls = lb_balls(int(slider_val)) graph.set_ydata(lb_num_balls) # グラフの再描画 fig.canvas.draw_idle() # スライダーの表示位置 slider_pos = plt.axes([0.1, 0.01, 0.8, 0.03]) # Sliderオブジェクトのインスタンス作成 threshold_slider = Slider(slider_pos, 'n=', 0, 1000, valinit=1000,valfmt='%0.0f') # スライダーの値が変更された場合の処理を呼び出し threshold_slider.on_changed(threshold_update) plt.show()
sinの例ではスライドするたびに連続値を取るのですが、今回nは離散値を取りたいのでvalfmt='%0.0f’とします。
雑談
明日から6月ですね〜
4、5月は本当に忙しかったですがとても充実していました。
6月はいのりさんのライブがあるのでとても楽しみです。がんばりぼん。