Vor kurzem gab es die folgenden Hürden in Bezug auf die Programmierung.
(1) Ich möchte ein GUI-Programm mit Python erstellen. → OK mit Tkinter (2) Ich möchte einige Berechnungsergebnisse in einem Diagramm anzeigen. → OK mit matplotlib (3) Ich möchte den von matplotlib in (2) geschriebenen Graphen in Tkinter in (1) einbetten. → NG
Ich habe versucht, darüber hinwegzukommen, indem ich mit dem Beispielcode gespielt habe, aber es hat nicht funktioniert.
Dieser Artikel stellt den Inhalt der Lösung des Problems (3) vor.
Zuerst stellte ich fest, dass ich die Objektorientierung von matplotlib verstehen musste. Das von matplotlib.pyplot erstellte Diagramm ist ein Objekt der Figure-Klasse, ein Objekt der Axes-Klasse, das das tatsächliche Diagramm zeichnet, und ein Objekt (im Folgenden Instanz) der Axis-Klasse, das die x-Achse und die y-Achse wie folgt verwaltet. Es besteht aus drei Teilen.
(Hinweis: Achsen bedeuten auf Englisch Achse, in matplotlib jedoch den Teil, der den Graphen zeichnet, nicht die Achse.)
Zeichnen wir nun ein einfaches Diagramm mit dem objektorientierten Design von matplotlib.
(1) Generieren Sie eine Figur, die eine Figureninstanz ist.
fig = plt.figure()
(2) Generieren Sie vier Achseninstas, um den tatsächlichen Graphen zu zeichnen.
ax1, ax2, ax3, ax4
(3) Ordnen und zeichnen Sie die vier Achseninstas in einer (2X2) -Matrix auf den Feigeninstas.
ax1 = fig.add_subplot(221) ax2 = fig.add_subplot(222) ax3 = fig.add_subplot(223) ax4 = fig.add_subplot(224) plt.show()
Das Zeichnungsergebnis wird in der folgenden Abbildung angezeigt. An dem runden Symbol (oben links) dieses Fensters können Sie erkennen, dass es sich um Matplotlib handelt.
Der Programmcode des objektorientierten Entwurfs von matplotlib wird veröffentlicht.
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()
Als Nächstes wird beschrieben, wie Sie ein Matploblib-Diagramm in Tkinter einbetten. Die Vorgehensweise wird anhand der folgenden Abbildung erläutert.
(1) Bereiten Sie ein Tkinter-Fenster vor. Nennen Sie die Instanz root. (2) Platzieren Sie eine Canvas-Instanz über root. (3) Bereiten Sie eine Feigeninstanz mit einem Diagramm vor, das auf die gleiche Weise wie im vorherigen Kapitel gezeichnet wurde. (4) Platzieren Sie die Feigeninstanz auf der Leinwandinstanz und zeichnen Sie sie.
Es ist kompliziert, weil es drei Fälle gibt. Wenn Sie dieses Konzept jedoch berücksichtigen, wird die GUI-Programmierung ab dem nächsten Mal einfacher.
Der folgende Code würde die obigen Schritte (2) und (4) ausführen. Seien Sie vorsichtig, wenn Sie "FigureCanvasTkAgg" verwenden.
canvas = FigureCanvasTkAgg(fig, master=root) # Generate canvas instance, Embedding fig in root
canvas.draw()
canvas.get_tk_widget().pack()
Das Zeichnungsergebnis wird in der folgenden Abbildung angezeigt. Ich konnte ein Matplot-Diagramm auf der GUI gut zeichnen. An dem blauen Federsymbol (oben links) in diesem Fenster können Sie erkennen, dass es sich um Tkinter handelt.
Ich werde den Programmcode veröffentlichen, um das Diagramm von matplotlib in Tkinter einzubetten. Unter Beibehaltung des Programmcodes des vorherigen Kapitels wird der Inhalt des Tkinter-Teils in der zweiten Hälfte erweitert.
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) Ich möchte ein mit matplotlib geschriebenes Diagramm in Tkinter einbetten, aber es hat nicht funktioniert. (2) Zunächst müssen Sie einen Matplotlib-Greifer in einem objektorientierten Design zeichnen. (3) Bereiten Sie dann eine Canvas-Instanz von Tkinter vor und fügen Sie eine Instanz von matplotlib graph hinzu.
Recommended Posts