前提・実現したいこと
Sliderの値に合わせてグラフを変化させたい。
matplotlibのSliderを5つ用いる。
5つのSliderはそれぞれ5つのパラメータの値に対応し、Sliderを動かすとパラメータに合わせて計算が行われる。
計算結果に合わせてグラフが変更されるプログラムを作成したい。(図2のSliderを動かすと図1グラフが変形するようにしたい。グラフとSliderは同一Windowでも可能)
発生している問題
図2のSlider5つから引数を取って、図1のグラフを動かす方法が分からない。
コード中の**onchanged(growth)**が引数を1つのSliderからしか取る事ができない為、全てのSliderの状態を引数として関数growthを動かしたい。
Python
1# -*- coding: utf-8 -*- 2# スライダーでal,rA,rB,dA,dBの範囲を変更できるように 3 4import matplotlib.pyplot as plt 5from matplotlib.widgets import Slider 6 7def growth(al, rA, rB, dA, dB, s = 0.1, NA0 = 0.1, NB0 = 0.1, P0 = 0.1, t = 10000): 8 # NAt,NBt:被食者2種 9 # rA,rB:内的自然増加率 10 # dA,dB:被食者A,Bの捕食者に対する脆弱性 11 # s:捕食者の死亡率 12 # X:被食者総数 13 # P:捕食者数 14 # Q:捕食者が被食者を発見する割合 15 # al:個体の増加割合 16 NAt = NA0 17 NBt = NB0 18 Pt = P0 19 X = NA0 + NB0 20 Q = dA * NAt + dB * NBt 21 time = [] 22 dataNA = [] 23 dataNB = [] 24 dataP = [] 25 dataX = [] 26 27 time.append(0) # リストに初期値代入 28 dataNA.append(NAt) 29 dataNB.append(NBt) 30 dataP.append(Pt) 31 dataX.append(NAt + NBt) 32 33 for i in range(t): 34 NAt, NBt = NAt + al * NAt * (rA - X - dA * Pt), NBt + al * NBt * (rB - X - dB * Pt) 35 Pt = Pt + al * Pt * (Q - s) 36 X = NAt + NBt 37 Q = dA * NAt + dB * NBt 38 time.append(i + 1) # リストに算出されたデータを入れる 39 dataNA.append(NAt) 40 dataNB.append(NBt) 41 dataP.append(Pt) 42 dataX.append(X) 43 44 # graph表示 45 plt.figure(figsize=(5, 5)) 46 plt.plot(time, dataNA, label="preyA") 47 plt.plot(time, dataNB, label="preyB") 48 plt.plot(time, dataP, label="predator") 49 plt.plot(time, dataX, label="preyA+B") 50 plt.xlabel("time") 51 plt.ylabel("population size") 52 plt.legend() # 凡例の表示 53 54growth(0.20, 0.25, 0.2, 0.7, 0.01) #1度パラメータを代入してgrowthを実行 55 56 57# Slider表示 58# Sliderの表示位置[左,下,幅,高さ] 59plt.figure(figsize=(5, 3)) 60slider_pos1 = plt.axes([0.08, 0.80, 0.8, 0.18]) 61slider_pos2 = plt.axes([0.08, 0.60, 0.8, 0.18]) 62slider_pos3 = plt.axes([0.08, 0.40, 0.8, 0.18]) 63slider_pos4 = plt.axes([0.08, 0.20, 0.8, 0.18]) 64slider_pos5 = plt.axes([0.08, 0.00, 0.8, 0.18]) 65# Sliderの範囲設定 66# Sliderオブジェクトのインスタンス作成,Slider(アクセス,'ラベル',min,max, 初期値) 67al_slider = Slider(slider_pos1, 'al', 0, 1.0, valinit=0) 68rA_slider = Slider(slider_pos2, 'rA', 0, 1.0, valinit=0) 69rB_slider = Slider(slider_pos3, 'rB', 0, 1.0, valinit=0) 70dA_slider = Slider(slider_pos4, 'dA', 0, 1.0, valinit=0) 71dB_slider = Slider(slider_pos5, 'dB', 0, 1.0, valinit=0) 72# sliderの変更に合わせグラフを変化させる 73al_slider.on_changed(growth) 74rA_slider.on_changed(growth) 75rB_slider.on_changed(growth) 76dA_slider.on_changed(growth) 77dB_slider.on_changed(growth) 78 79plt.show()
開発環境
Python3
Pycharm
プログラム実行時の図
あなたの回答
tips
プレビュー