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).
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.
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()
Ensuite, comment intégrer un graphe matploblib dans Tkinter. La procédure est expliquée à l'aide de la figure ci-dessous.
(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é.
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()
(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.
Recommended Posts