[PYTHON] Betten Sie das Matplotlib-Diagramm in Tkinter ein

1. Zuallererst

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.

2. Matplotlib objektorientiertes Design

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. matplotlib.png

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()

3. Matplotlib in Tkinter einbetten

Als Nächstes wird beschrieben, wie Sie ein Matploblib-Diagramm in Tkinter einbetten. Die Vorgehensweise wird anhand der folgenden Abbildung erläutert.

nagare.png

(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.

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. Zusammenfassung

(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.

5. Referenzmaterialien

  1. Matplotlib Usage https://matplotlib.org/1.5.1/faq/usage_faq.html
  2. Grundkenntnisse in Matplotlib, die ich frühzeitig kennenlernen wollte 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. Tkinter-Ereignisbindung https://cassiopeia.hatenadiary.org/entry/20070822/1187712650

Recommended Posts

Betten Sie das Matplotlib-Diagramm in Tkinter ein
Generieren Sie Diagramme dynamisch mit matplotlib und binden Sie sie mit reporlab in PDF ein
Ich möchte Matplotlib in PySimpleGUI einbetten
Bilder mit Matplotlib anzeigen
App mit Registerkarten in Tkinter
2D-Plot in Matplotlib
Animieren Sie mehrere Diagramme mit matplotlib
Betten Sie die WAV-Datei in Jupyter ein
Zwei Möglichkeiten, mit matplotlib mehrere Grafiken in einem Bild anzuzeigen
[Python] Mit Tkinter mehrere Fenster anzeigen
Achsen in Matplotlib als Prozentsätze anzeigen
Implementieren Sie einen Datumssetzer in Tkinter
Betten Sie Ihr Lieblings-HTML in Jupyter ein
Zeichnen Sie mit Matplotlib ein Diagramm der Retentionsrate
Zeigen Sie Diagramme inline in Jupyter Notebook an
Heatmap mit Dendrogramm in Python + Matplotlib
Machen Sie matplotlib in 3 Minuten mit Japanisch kompatibel
Trennlinie im Matplotlib-Histogramm anzeigen
Zeichnen Sie einfach Diagramme mit matplotlib
Der erste Schritt von Python Matplotlib
GUI-Erstellung in Python mit tkinter 2
[Kleine Geschichte] So speichern Sie Matplotlib-Diagramme in einem Stapel mit Jupyter
Beseitigen Sie verstümmelte japanische Zeichen in Matplotlib-Diagrammen mit Cloud Pak for Data Notebook