田舎社会人のいろいろ学習記

Python、英語、その他いろいろ

【matplotlib】グラフをtkinterの画面に埋め込む方法【Python】

f:id:vigilantPotato:20210720005415p:plain
matplotlibのグラフをPythonのGUIツールであるtkinterに埋め込み、tkinterのウィジェットで設定した値とグラフの表示をリアルタイムで連動させる方法を整理する。


【スポンサーリンク】


グラフをtkinterへ埋め込む方法

matplotlib内のFigureCanvasTkAggオブジェクトを使用することで、グラフをtkinterの画面に埋め込むことが可能になる。また、グラフのツールバーの埋め込みには、NavigationToolbar2Tkを使用する。以下、例を示す。

import tkinter
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.figure import Figure
import numpy as np


root = tkinter.Tk()
root.title("matplotlib 埋め込み")

#グラフデータ
x = np.linspace(0, 2*np.pi, 400)
y = np.sin(x)

#グラフ用オブジェクト生成
fig = Figure(figsize=(5, 5), dpi=100)   #Figure
ax = fig.add_subplot(1, 1, 1)           #Axes
line, = ax.plot(x, y)                   #2DLine

#Figureを埋め込み
canvas = FigureCanvasTkAgg(fig, root)
canvas.get_tk_widget().pack()

#ツールバーを表示
toolbar=NavigationToolbar2Tk(canvas, root)

root.mainloop()
f:id:vigilantPotato:20210720005328p:plain

FigureCanvasTkAggにmatplotlibのFigureオブジェクトとtkinterのTkオブジェクトを渡し、get_tk_widgetメソッドを通してpackを実行することで、tkinterの画面内にグラフを表示させることができる。また、ツールバーはNavigationToolbar2Tkに作成したFigureCanvasTkAggオブジェクトとTkオブジェクトを渡すと表示される。

[↑ 目次へ]


【スポンサーリンク】


スケールとグラフをリアルタイムで連動

tkinterのScaleウィジェットで関数のパラメータを調整し、その結果をグラフにリアルタイムで反映させる例を示す。

import tkinter
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.figure import Figure
import numpy as np


#スケール用関数
def change(value):
    t = int(value)
    y = np.sin(t * x)
    line.set_ydata(y)
    canvas.draw()
    
root = tkinter.Tk()
root.title("matplotlib 埋め込み")

#グラフデータ
x = np.linspace(0, 2*np.pi, 400)
y = np.sin(x)

#グラフ用オブジェクト生成
fig = Figure(figsize=(3, 3))   #Figure
ax = fig.add_subplot(1, 1, 1)           #Axes
line, = ax.plot(x, y)                   #2DLine

#Figureを埋め込み
canvas = FigureCanvasTkAgg(fig, root)
canvas.get_tk_widget().pack()

#ツールバーを表示
toolbar=NavigationToolbar2Tk(canvas, root)

#スケール
s = tkinter.Scale(
    root,
    orient="horizontal",    #方向
    command=change,         #調整時に実行
    )
s.pack()

root.mainloop()

グラフの下にスケールが表示され、左右にスケールを動かすとchange関数が実行されてグラフが更新される。

f:id:vigilantPotato:20210720005415p:plain f:id:vigilantPotato:20210720005449p:plain

【スポンサーリンク】