Python Graphik mit tkinter und matplotlib

Gast #7044447
Lesenswert?
• ▲
▼
Ich versuche gerade Matplotlib-Graphiken in einer tkinter Oberfläche 
frei zu positionieren.
Irgendwie wird aber immer nur eine Graphik gezeigt. Wie kann ich beide 
Graphen sichtbar machen?
Oder ist es eventuell gar nicht möglich, zwei frei positionierbare 
Graphen in der Oberfläche zu haben?
Angehängte Dateien:
Gast #7044464
Lesenswert?
• ▲
▼
Du baust zwei Plots (Figure), die übereinander liegen. So geht es bei 
mir:
1
f = Figure(figsize=(3, 2), dpi=100)
2
a = f.add_subplot(121)
3
a.plot([1,2,3,4,5,6,7,8],[1,2,1,3,8,9,3,5])
4

5
canvas = FigureCanvasTkAgg(f, mainWindow)
6
canvas.get_tk_widget().pack(padx=150, pady=100,side=tk.LEFT)
7

8
a2 = f.add_subplot(122)
9
a2.plot([1,2,3,4,5,6,7,8],[5,6,1,3,8,9,3,5])
10

11
canvas2 = FigureCanvasTkAgg(f, mainWindow)
12
canvas2.get_tk_widget().pack(padx=300, pady=100, side=tk.RIGHT)
Gast #7044534
Lesenswert?
• ▲
▼
Danke für's drauf schauen.
In deiner Version nutzt Du die MatPlotLib-Funkton "subplot", die mehrere 
Graphen in eine MatPlotLib-Ausgabe zeichnet. Damit brauch man kein 
canvas2, weil nur eine MatPlotLib-Graphik gezeichnet wird.
Das ist nicht, was ich suche, weil ich die zweite Graphik (bzw. beliebig 
viele) frei x/y positionieren will.
Gast #7044721
Lesenswert?
• ▲
▼
Es scheint, dass deine padx und pady Probleme machen. Wenn ich die so 
wie hier reduziere, dann sehe ich zwei Kurven:
1
import matplotlib
2

3
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
4

5
from matplotlib.figure import Figure
6

7
import tkinter as tk
8
from tkinter import ttk
9

10
LARGE_FONT = ("Verdana", 12)
11

12
mainWindow = tk.Tk()
13
mainWindow.geometry("1024x640")
14

15
# tk.Frame.__init__(mainWindow, parent)
16
label = tk.Label(mainWindow, text="Graph Page!", font=LARGE_FONT)
17
label.place(x=600, y=50)
18

19
button1 = ttk.Button(mainWindow, text="little button", command=lambda: controller.show_frame(StartPage))
20
button1.place(x=600, y=300)
21

22
f = Figure(figsize=(3, 2), dpi=100)
23
a = f.add_subplot(111)
24
a.plot([1, 2, 3, 4, 5, 6, 7, 8], [1, 2, 1, 3, 8, 9, 3, 5])
25

26
canvas = FigureCanvasTkAgg(f, mainWindow)
27
canvas.get_tk_widget().pack(padx=10, pady=10, side=tk.LEFT)
28

29
f2 = Figure(figsize=(3, 2), dpi=100)
30
a2 = f2.add_subplot(111)
31
a2.plot([1, 2, 3, 4, 5, 6, 7, 8], [5, 6, 1, 3, 8, 9, 3, 5])
32

33
canvas2 = FigureCanvasTkAgg(f2, mainWindow)
34
canvas2.get_tk_widget().pack(padx=10, pady=10, side=tk.LEFT)
35

36
mainWindow.mainloop()
Gast #7045057
Lesenswert?
• ▲
▼
Martin (Gast)
>Es scheint, dass deine padx und pady Probleme machen. Wenn ich die so
>wie hier reduziere, dann sehe ich zwei Kurven:

Ja, bei mir erscheinen damit auch zwei Plot-Windows.
Allerdings hat es überhaupt keinen Einfluss, wenn ichz.B. die Zeile 34 
auf eine andere Position ändere:
1
canvas2.get_tk_widget().pack(padx=10, pady=200, side=tk.LEFT)

Es sieht so aus, als wenn der Fenstermanager mit "pack" die 
Positionsangaben ignoriert.
Gast #7045154
Lesenswert?
• ▲
▼
>Eine absolute Position in X und Y sollte sich mit ".place" festlegen
>lassen.
Hab ich schon probiert. Aber es sieht so aus, als wenn die Window-Klasse
1
FigureCanvasTkAgg

für PyPlot kein "place" hat.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.