WASY-LOG

たいした話はしません

matplotlib.widgets.Sliderを使ってみる

はじめに

日本語の記事があまり見当たらなかったので書きます.自分用メモも兼ねてます.

動作環境

Python 3.6.1 :: Anaconda 4.4.0 (matplotlib 2.0.2)

Sliderオブジェクトについて

Sliderオブジェクトはmatplotlib.widgets内のクラスで,マウス操作で値が変わるスライダを配置できます.IFFT後の波形を見ながらフィルタのしきい値を決めたいときなんかに便利です(たぶん).
また,matplotlib.widgetsには他にもラジオボタンAPIなどが用意されています.

実装

公式のサンプルコードとは別の例として,ギターの音を録音したwavファイルの波形をクリッピングしてみます.

# -*- coding: utf-8 -*-

from scipy.io.wavfile import read
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider

inputfilename = './smoke.wav'

samplingrate, wavedata = read(inputfilename)
wavedata = wavedata[:, 0] #モノラルにする

# グラフ描画位置などの設定
fig, ax = plt.subplots()
plt.subplots_adjust(left=0.1, bottom=0.15)

graph, = plt.plot(wavedata)

# Sliderの位置設定
ax_thre = plt.axes([0.1, 0.01, 0.8, 0.03])
# Sliderオブジェクトのインスタンスの作成
threshold_slider = Slider(ax_thre, 'Dist', 0, wavedata.max(),
        valinit=wavedata.max())

def threshold_update(slider_val):
    wavedata_updated = wavedata.clip(-(slider_val), slider_val)
    # グラフの値のアップデートと再描画
    graph.set_ydata(wavedata_updated)
    fig.canvas.draw_idle()

# Slider値変更時の処理の呼び出し
threshold_slider.on_changed(threshold_update)

plt.show()

plt.plot()はそのままだとリストを返してしまうため,graphのあとにカンマをつけて先頭の要素(Line2Dオブジェクト)を受け取るようにしています.
Sliderクラスに渡している第一引数はAxes,第二引数はラベル,第三・第四引数はインスタンスが持つ値の最小値と最大値,キーワード引数initvalで指定しているのは初期値です.
threshold_slider.on_changed(func)メソッドでSliderのインスタンスthreshold_sliderの値が変化したときのイベントハンドラを指定します.イベントハンドラはSliderインスタンスの現在の値をただひとつの引数として持ちます.
また,今回は使用していませんが,Slider_instance.valの形でイベントハンドラの外からでも値を保持しているインスタンスの属性にアクセスできます.

出力

f:id:beybr6:20170707232922g:plain