【Matplotlib】対話モードをキー入力で終了(Windows)

Python向けグラフ描画ライブラリ「Matplotlib」を用いて、Windows上で対話モードを使うときに、キーイベントで終了させる方法を紹介します。

対話モード(インタラクティブモード)の終了

前回記事では、Python+Matplotlibでリアルタイム変化するグラフを作成する方法を紹介しました。

前回記事
1 【Matplotlib】リアルタイムグラフ

しかし、Windows上では画面の閉じるボタンを押すとフリーズしてしまう問題があります。
そこで今回は、キー入力でフリーズさせずに対話モードを終了させる方法を紹介します。

ソースコード

サンプルプログラムのソースコードです。

# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import ctypes
import time

def getkey(key):
    return(bool(ctypes.windll.user32.GetAsyncKeyState(key)&0x8000))

def line000(pos):
    WIDTH = 80
    pl = [(pos)%WIDTH, (pos+1)%WIDTH, (pos+2)%WIDTH]
    rettxt = ""
    for i in range(WIDTH):
        if i in pl:
            rettxt += "0"
        else:
            rettxt += "-"
    return(rettxt)


def realtime_graph(x, y):
    line, = plt.plot(x, y, "ro",label="y=x") # (x,y)のプロット
    line.set_ydata(y)   # y値を更新
    plt.title("Graph")  # グラフタイトル
    plt.xlabel("x")     # x軸ラベル
    plt.ylabel("y")     # y軸ラベル
    plt.legend()        # 凡例表示
    plt.grid()          # グリッド表示
    plt.xlim([0,10])    # x軸範囲
    plt.ylim([0,10])    # y軸範囲
    plt.draw()          # グラフの描画
    plt.pause(0.01)     # 更新時間間隔
    plt.clf()           # 画面初期化


def main():
    ESC = 0x1B          # ESCキーの仮想キーコード
    (x, y) = (0, 0)     # 初期値
    plt.ion()           # 対話モードオン

    while( y != 10 ):
        realtime_graph(x, y)
        x += 1
        y = x
        if getkey(ESC):     # ESCキーが押されたら終了
            break

    plt.close()



if __name__ == '__main__':
    main()

実行結果

サンプルプログラムの実行結果は下記の通りです。

ESCキーを押すと無事にグラフ画面が閉じました。

【おすすめ関連記事】
Matplotlib入門 サンプルプログラム集

関連記事