[PYTHON] Intégrer le graphe matplotlib dans Tkinter

1.Tout d'abord

Récemment, il y a eu les obstacles suivants concernant la programmation.

(1) Je souhaite créer un programme GUI avec Python. → OK avec Tkinter (2) Je souhaite afficher certains résultats de calcul sur un graphique. → OK avec matplotlib (3) Je veux intégrer le graphe écrit par matplotlib dans (2) dans Tkinter dans (1). → NG

J'ai essayé de m'en remettre en jouant avec l'exemple de code, mais cela n'a pas fonctionné.

Cet article présente le contenu de la résolution du problème (3).

2. Conception orientée objet Matplotlib

Tout d'abord, j'ai trouvé que j'avais besoin de comprendre l'orientation objet de matplotlib. Le graphe créé par matplotlib.pyplot est un objet de la classe Figure, un objet de la classe Axes qui dessine le graphe réel et un objet (ci-après, une instance) de la classe Axis qui gère les axes x et y comme suit. Il se compose de trois parties.

(Remarque: Axes en anglais signifie axis, mais dans matplotlib, cela signifie la partie qui dessine le graphique, pas l'axe.)

Maintenant, dessinons un graphique simple en utilisant la conception orientée objet de matplotlib.

(1) Générez une figure qui est une instance de figure.

fig = plt.figure()

(2) Générez quatre instas Axes pour dessiner le graphique réel.

ax1, ax2, ax3, ax4

(3) Disposer et dessiner les quatre instas Axes dans une matrice (2X2) sur les instas fig.

ax1 = fig.add_subplot(221) ax2 = fig.add_subplot(222) ax3 = fig.add_subplot(223) ax4 = fig.add_subplot(224) plt.show() Le résultat du dessin est affiché dans la figure suivante. Vous pouvez dire qu'il s'agit de Matplotlib grâce à l'icône ronde (en haut à gauche) de cette fenêtre. matplotlib.png

Le code de programme de la conception orientée objet de matplotlib est affiché.

import numpy as np
import matplotlib.pyplot as plt

#Prepare Data
x1 = np.linspace(0.0, 5.0)
y1 = np.cos(2 * np.pi * x1) * np.exp(-x1)
x2 = np.linspace(0.0, 3.0)
y2 = np.cos(2 * np.pi * x2) * np.exp(-x1)


# Figure instance
fig = plt.figure()
print(type(fig))

#ax1 instance
ax1 = fig.add_subplot(221)
ax1.plot(x1, y1)
ax1.set_title('line plot')
ax1.set_ylabel('Damped oscillation')
print(type(ax1))

#ax2 instance
ax2 = fig.add_subplot(222)
ax2.scatter(x1, y1, marker='o')
ax2.set_title('Scatter plot')

#ax3 instance
ax3 = fig.add_subplot(223)
ax3.plot(x2,y2)
ax3.set_ylabel('Damped oscillation')
ax3.set_xlabel('time (s)')

#ax4 instance
ax4 = fig.add_subplot(224)
ax4.scatter(x2, y2, marker='o')
ax4.set_xlabel('time (s)')

#Drawing
plt.show()

3. Intégrez matplotlib dans Tkinter

Ensuite, comment intégrer un graphe matploblib dans Tkinter. La procédure est expliquée à l'aide de la figure ci-dessous.

nagare.png

(1) Préparez une fenêtre Tkinter. Nommez la racine de l'instance. (2) Placez une instance de canevas au-dessus de root. (3) Préparez une instance de fig avec un graphique dessiné de la même manière que dans le chapitre précédent. (4) Placez l'occurrence fig sur l'occurrence canvas et dessinez-la.

C'est compliqué car il y a trois cas. Cependant, si vous gardez ce concept à l'esprit, la programmation de l'interface graphique à partir de la prochaine fois sera plus facile.

Le code suivant effectuerait les étapes (2) et (4) ci-dessus. Soyez prudent lorsque vous utilisez FigureCanvasTkAgg.

canvas = FigureCanvasTkAgg(fig, master=root)  # Generate canvas instance, Embedding fig in root
canvas.draw()
canvas.get_tk_widget().pack()

Le résultat du dessin est affiché dans la figure suivante. J'ai pu bien dessiner un graphique matplot sur l'interface graphique. Vous pouvez dire qu'il s'agit de Tkinter à partir de l'icône de plume bleue (en haut à gauche) de cette fenêtre.

Je posterai le code du programme pour intégrer le graphe de matplotlib dans Tkinter. Tout en conservant le code de programme du chapitre précédent, le contenu de la partie Tkinter est développé dans la seconde moitié.

tkinter.png
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import tkinter as tk

# Prepare Data
x1 = np.linspace(0.0, 5.0)
y1 = np.cos(2 * np.pi * x1) * np.exp(-x1)
x2 = np.linspace(0.0, 3.0)
y2 = np.cos(2 * np.pi * x2) * np.exp(-x1)

# Figure instance
fig = plt.Figure()

# ax1
ax1 = fig.add_subplot(221)
ax1.plot(x1, y1)
ax1.set_title('line plot')
ax1.set_ylabel('Damped oscillation')

# ax2
ax2 = fig.add_subplot(222)
ax2.scatter(x1, y1, marker='o')
ax2.set_title('Scatter plot')

# ax3
ax3 = fig.add_subplot(223)
ax3.plot(x2, y2)
ax3.set_ylabel('Damped oscillation')
ax3.set_xlabel('time (s)')

# ax4
ax4 = fig.add_subplot(224)
ax4.scatter(x2, y2, marker='o')
ax4.set_xlabel('time (s)')


# When windows is closed.

def _destroyWindow():
    root.quit()
    root.destroy()


# Tkinter Class

root = tk.Tk()
root.withdraw()
root.protocol('WM_DELETE_WINDOW', _destroyWindow)  # When you close the tkinter window.

# Canvas
canvas = FigureCanvasTkAgg(fig, master=root)  # Generate canvas instance, Embedding fig in root
canvas.draw()
canvas.get_tk_widget().pack()
#canvas._tkcanvas.pack()

# root
root.update()
root.deiconify()
root.mainloop()

4. Résumé

(1) Je veux intégrer un graphique écrit avec matplotlib dans Tkinter, mais cela n'a pas fonctionné. (2) Tout d'abord, vous devez dessiner une capture matplotlib dans une conception orientée objet. (3) Ensuite, préparez une instance canvas de Tkinter et placez-y une instance du graphe matplotlib.

5. Documents de référence

  1. Matplotlib Usage https://matplotlib.org/1.5.1/faq/usage_faq.html
  2. Connaissance de base de matplotlib que je voulais connaître tôt https://qiita.com/skotaro/items/08dc0b8c5704c94eafb9
  3. Embedding in Tk https://matplotlib.org/3.1.1/gallery/user_interfaces/embedding_in_tk_sgskip.html
  4. Liaison d'événement Tkinter https://cassiopeia.hatenadiary.org/entry/20070822/1187712650

Recommended Posts

Intégrer le graphe matplotlib dans Tkinter
Générez dynamiquement des graphiques avec matplotlib et intégrez-les au PDF avec reporlab
Je veux intégrer Matplotlib dans PySimpleGUI
Afficher les images avec Matplotlib
Application utilisant des onglets dans Tkinter
Graphique 2D dans matplotlib
Animer plusieurs graphiques avec matplotlib
Incorporer le fichier wav dans Jupyter
Deux façons d'afficher plusieurs graphiques dans une seule image avec matplotlib
[Python] Afficher plusieurs fenêtres avec Tkinter
Afficher les axes sous forme de pourcentages dans Matplotlib
Implémenter un paramètre de date dans Tkinter
Incorporez votre HTML préféré dans Jupyter
Dessiner un graphique du taux de rétention avec Matplotlib
Afficher les graphiques en ligne dans Jupyter Notebook
Heatmap avec dendrogramme en Python + matplotlib
Rendre matplotlib compatible avec le japonais en 3 minutes
Afficher la ligne de division dans l'histogramme matplotlib
Dessinez facilement des graphiques avec matplotlib
La première étape de Python Matplotlib
Création d'interface graphique en python avec tkinter 2
[Petite histoire] Comment enregistrer des graphiques matplotlib dans un lot avec Jupyter
Éliminez les caractères japonais brouillés dans les graphiques matplotlib avec Cloud Pak for Data Notebook