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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren