機能: matplotlibのグラフにinteractive機能を追加
1.Early Stopボタンを実装
2.マウスでクリックした最近接のデータの情報を表示する。
注意: axis.plot(),
axis.scatter()
で描画したデータのみ対応
# tkFitのimport
from tklib.tkgraphic.tkplotevent import tkPlotEvent
# matplotlibの準備
fig = plt.figure(figsize = cparams.figsize)
ax1 = fig.add_subplot(1, 2, 1)
# tkPlotEventのインスタンス作成。pyplotオブジェクトを渡す
app.plot_event = tkPlotEvent(plt)
# Early
Stopのボタンを追加。引数に何も与えないと、デフォルトのStopボタンを表示する
# デフォルトのStopボタンをクリックすると、plotevent.stop_flag
に Trueが設定される
plot_event.add_button()
# グラフを .show()
や.pause()で表示させる前に、.layout()を呼び出してStopボタンが正常に表示されるようにする
plot_event.layout()
plt.pause(0.001)
# 計算ループ内で .stop_flag
をチェックすることでEarly Stopさせる
if plot_event.stop_flag:
return False
2.マウスでクリックした最近接のデータの情報を表示する。
# tkFitのimport
from tklib.tkgraphic.tkplotevent import tkPlotEvent
# matplotlibの準備
fig = plt.figure(figsize = cparams.figsize)
axis = fig.add_subplot(1, 2, 1)
# tkPlotEventのインスタンス作成。pyplotオブジェクトを渡す
plot_event = tkPlotEvent(plt)
# グラフを描画。返り値を取得
input_data = axis.plot(xT, yCp, label = '$C_p$(obs)')
# データを登録 (axis.plot()の場合)
plot_event.add_data({"label": "input", "plot_type": "2D", "axis": ax1, "data":
input_data})
# データを登録 (axis.scatter()の場合)
# グラフのx,yデータを "x"、"y"で、他の従属変数を xlistとxlabelsで与える
# x, y, xlistは、DataFrameではなくlist型に変換し、通常のリストの順番:
x_list[データ種類の番号][データ番号]、x_labels[データ種類の番号]
plot_event.add_data({"label": "input", "plot_type": "2D", "axis":
axis, "data": input_data,
"x": x_list, "y": y_list, "xlist": descriptor_all, "xlabels": x_labels})
# figで指定したグラフに左ボタンクリックイベントを登録
plot_event.register_event(fig)
2'.twinx()などで軸を2つにした場合
fig, axes = plt.subplots(2, 1)
ax2 = axes[0].twinx()
この場合、callbackのevent引数の event.x, event.y
には右Y軸、ax2の数値座標が与えられる。
そのため、event.x, event.y
をaxes[0]の数値座標に変換する必要があるため、.add_data()
の変数にaxis_scaleを追加する。
data1 = axes[0].plot(t, tau, label = 'tau')
data2 = ax2.plot(t, b0, label = 'b0')
plot_event.add_data({"label": "tau", "plot_type": "2D",
"axis": ax2, "data": data1, "axis_scale":
axxes[0]})
plot_event.add_data({"label": "b0", "plot_type": "2D", "axis":
ax2, "data": data2, "axis_scale":
ax2)