たくさん寝太郎の寝床

料理とITと皿回しが好きなオタクのブログ

Sliderの話

こんにちは、たくさん寝太郎です。

来週は人工知能学会があるのでゼミが休みです。



kaworu-mk6.hatenablog.com
さて、今日は先日記事にした「エーレンフェストの壺の話」のレポートを書いていたのですが、途中で「これnの数をスライドで動かせるようにしたいなぁ」と思ったので出来ないか調べてみました。

matplotlib.widgetsにSliderというものがあり、それで出来そうだったので試してみました。

kite.com

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を動かしてみました。

f:id:kaworu_mk6:20190531215858g:plain


これを先日のエーレンフェストの壺でやってみると次のようになります。

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

f:id:kaworu_mk6:20190531220303g:plain

sinの例ではスライドするたびに連続値を取るのですが、今回nは離散値を取りたいのでvalfmt='%0.0f’とします。




雑談

明日から6月ですね〜
4、5月は本当に忙しかったですがとても充実していました。
6月はいのりさんのライブがあるのでとても楽しみです。がんばりぼん。