質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.77%

matplotlibでのSliderパラメータの複数利用

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 1,140

taku0909

score 13

前提・実現したいこと

Sliderの値に合わせてグラフを変化させたい。
matplotlibのSliderを5つ用いる。
5つのSliderはそれぞれ5つのパラメータの値に対応し、Sliderを動かすとパラメータに合わせて計算が行われる。
計算結果に合わせてグラフが変更されるプログラムを作成したい。(図2のSliderを動かすと図1グラフが変形するようにしたい。グラフとSliderは同一Windowでも可能)

発生している問題

図2のSlider5つから引数を取って、図1のグラフを動かす方法が分からない。
コード中のonchanged(growth)が引数を1つのSliderからしか取る事ができない為、全てのSliderの状態を引数として関数growthを動かしたい。

# -*- coding: utf-8 -*-
# スライダーでal,rA,rB,dA,dBの範囲を変更できるように

import matplotlib.pyplot as plt
from matplotlib.widgets import Slider

def growth(al, rA, rB, dA, dB, s = 0.1, NA0 = 0.1, NB0 = 0.1, P0 = 0.1, t = 10000):
    # NAt,NBt:被食者2種
    # rA,rB:内的自然増加率
    # dA,dB:被食者A,Bの捕食者に対する脆弱性
    # s:捕食者の死亡率
    # X:被食者総数
    # P:捕食者数
    # Q:捕食者が被食者を発見する割合
    # al:個体の増加割合
    NAt = NA0
    NBt = NB0
    Pt = P0
    X = NA0 + NB0
    Q = dA * NAt + dB * NBt
    time = []
    dataNA = []
    dataNB = []
    dataP = []
    dataX = []

    time.append(0)  # リストに初期値代入
    dataNA.append(NAt)
    dataNB.append(NBt)
    dataP.append(Pt)
    dataX.append(NAt + NBt)

    for i in range(t):
        NAt, NBt = NAt + al * NAt * (rA - X - dA * Pt), NBt + al * NBt * (rB - X - dB * Pt)
        Pt = Pt + al * Pt * (Q - s)
        X = NAt + NBt
        Q = dA * NAt + dB * NBt
        time.append(i + 1)  # リストに算出されたデータを入れる
        dataNA.append(NAt)
        dataNB.append(NBt)
        dataP.append(Pt)
        dataX.append(X)

    # graph表示
    plt.figure(figsize=(5, 5))
    plt.plot(time, dataNA, label="preyA")
    plt.plot(time, dataNB, label="preyB")
    plt.plot(time, dataP, label="predator")
    plt.plot(time, dataX, label="preyA+B")
    plt.xlabel("time")
    plt.ylabel("population size")
    plt.legend()  # 凡例の表示

growth(0.20, 0.25, 0.2, 0.7, 0.01)  #1度パラメータを代入してgrowthを実行


# Slider表示
# Sliderの表示位置[左,下,幅,高さ]
plt.figure(figsize=(5, 3))
slider_pos1 = plt.axes([0.08, 0.80, 0.8, 0.18])
slider_pos2 = plt.axes([0.08, 0.60, 0.8, 0.18])
slider_pos3 = plt.axes([0.08, 0.40, 0.8, 0.18])
slider_pos4 = plt.axes([0.08, 0.20, 0.8, 0.18])
slider_pos5 = plt.axes([0.08, 0.00, 0.8, 0.18])
# Sliderの範囲設定
# Sliderオブジェクトのインスタンス作成,Slider(アクセス,'ラベル',min,max, 初期値)
al_slider = Slider(slider_pos1, 'al', 0, 1.0, valinit=0)
rA_slider = Slider(slider_pos2, 'rA', 0, 1.0, valinit=0)
rB_slider = Slider(slider_pos3, 'rB', 0, 1.0, valinit=0)
dA_slider = Slider(slider_pos4, 'dA', 0, 1.0, valinit=0)
dB_slider = Slider(slider_pos5, 'dB', 0, 1.0, valinit=0)
# sliderの変更に合わせグラフを変化させる
al_slider.on_changed(growth)
rA_slider.on_changed(growth)
rB_slider.on_changed(growth)
dA_slider.on_changed(growth)
dB_slider.on_changed(growth)

plt.show()

開発環境

Python3
Pycharm

プログラム実行時の図

図1
イメージ説明

図2
イメージ説明

```

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る