D2MatE Top page

tklib Top page

tkPlotEventクラス

機能: matplotlibのグラフにinteractive機能を追加
    1.Early Stopボタンを実装
    2.マウスでクリックした最近接のデータの情報を表示する。
      注意: axis.plot(), axis.scatter() で描画したデータのみ対応

1.Early Stopボタンを実装
コード例

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