Python
 Computer >> コンピューター >  >> プログラミング >> Python

MatplotlibのアニメーションをTkinterフレームに埋め込む方法

Matplotlibで作成したアニメーションをTkinterのフレームに埋め込むことで、GUIアプリケーションの中で動的なグラフを表示できます。本記事では、FigureCanvasTkAggFuncAnimationを使って、Tkinterウィンドウ内にアニメーションを組み込む具体的な手順とサンプルコードを解説します。

実装の手順

  • 図(figure)のサイズを設定し、サブプロット間および周囲のパディングを調整します。
  • アプリケーションのメインウィンドウとなるTkのToplevelウィジェットを作成します。
  • ウィジェットのタイトルを設定します。
  • 現在の図に軸(axes)を追加し、現在の軸として設定します。
  • 新しい図を作成するか、既存の図をアクティブ化します。
  • サブプロット配置の一部として、図にaxを追加します。
  • linewidth=2を指定してダミーの折れ線グラフを作成します。
  • 図をレンダリングするためのキャンバスを作成します。
  • 操作対象となるFigureCanvasを生成します。
  • Tkinterウィンドウを終了できるよう、キー押下(keypress)イベントを登録します。
  • 関数animateを繰り返し呼び出すことでアニメーションを生成します。
  • 図を表示するには、mainloop()メソッドを使用します。

サンプルコード

import tkinter
from matplotlib.backends.backend_tkagg import (
    FigureCanvasTkAgg, NavigationToolbar2Tk)
from matplotlib.backend_bases import key_press_handler
from matplotlib import pyplot as plt, animation
import numpy as np

plt.rcParams["figure.figsize"] = [7.00, 3.50]
plt.rcParams["figure.autolayout"] = True

root = tkinter.Tk()
root.wm_title("Embedding in Tk")

plt.axes(xlim=(0, 2), ylim=(-2, 2))
fig = plt.Figure(dpi=100)
ax = fig.add_subplot(xlim=(0, 2), ylim=(-1, 1))
line, = ax.plot([], [], lw=2)

canvas = FigureCanvasTkAgg(fig, master=root)
canvas.draw()

toolbar = NavigationToolbar2Tk(canvas, root, pack_toolbar=False)
toolbar.update()

canvas.mpl_connect(
    "key_press_event", lambda event: print(f"you pressed {event.key}"))
canvas.mpl_connect("key_press_event", key_press_handler)

button = tkinter.Button(master=root, text="Quit", command=root.quit)
button.pack(side=tkinter.BOTTOM)

toolbar.pack(side=tkinter.BOTTOM, fill=tkinter.X)
canvas.get_tk_widget().pack(side=tkinter.TOP, fill=tkinter.BOTH, expand=1)

def init():
    line.set_data([], [])
    return line,

def animate(i):
    x = np.linspace(0, 2, 1000)
    y = np.sin(2 * np.pi * (x - 0.01 * i))
    line.set_data(x, y)
    return line,

anim = animation.FuncAnimation(fig, animate, init_func=init,frames=200, interval=20, blit=True)

tkinter.mainloop()

コードのポイント

FigureCanvasTkAggは、Matplotlibの図をTkinterウィジェットとして描画するためのクラスです。これにより、通常のTkinterウィジェットと同じようにpack()などでレイアウトを制御できます。また、NavigationToolbar2Tkを追加すると、ズームやパンなどの操作ツールバーも利用可能になります。

アニメーションの本体はanimation.FuncAnimationです。animate(i)関数がフレームごとに呼び出され、正弦波の位相を少しずつずらすことで波形が動いて見えます。blit=Trueを指定することで、変化した部分だけを再描画し、描画パフォーマンスが向上します。

実行結果

上記のコードを実行すると、Tkinterウィンドウ内で正弦波が左から右へ流れるようなアニメーションが表示されます。

MatplotlibのアニメーションをTkinterフレームに埋め込む方法

  1. MatplotlibアニメーションがIPython Notebookで動かない?FuncAnimationを使った作図アニメーションの実装方法

    Matplotlibでプロットをアニメーション化する手順 Matplotlibでグラフをアニメーション表示するには、以下の手順に従います。 figureサイズの設定とパディング調整:図のサイズを指定し、サブプロット間および周囲の余白(パディング)を調整します。 ランダムデータの生成:NumPyを使って、10×10×8の形状を持つランダムなデータを作成します。 図とサブプロットの作成:subplots()メソッドを使用して、figureオブジェクトとAxes(サブプロット)を生成します。 アニメーションの作成:FuncAnimation()クラスを使い、関数funcを繰り返し呼び出すことでアニ

  2. FlaskでMatplotlibのグラフを表示する方法【サンプルコード付き】

    Webアプリケーション上でグラフを動的に表示したい場合、FlaskとMatplotlibを組み合わせるのが効果的です。この記事では、Flaskアプリケーション内でMatplotlibのプロットをPNG画像としてブラウザに返す方法を、具体的な手順とサンプルコードとともにわかりやすく解説します。 実装の流れ FlaskでMatplotlibのグラフを表示するまでの基本的な手順は以下の通りです。 小さなFlaskアプリケーションを作成する カレントディレクトリに移動し、環境変数を設定してアプリを起動する$ export FLASK_APP=file.py$ flask run ブラウザで http