Matplotlib tkinter - fill_between

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
fox1203
User
Beiträge: 56
Registriert: Montag 23. März 2020, 15:19

Hallo Zusammen,

habe folgenden Code zum Testen erfolgreich zusammengestellt:

Code: Alles auswählen

#!/usr/bin/env python3

import numpy as np
import matplotlib.pyplot as plt

depth = np.loadtxt("result.txt",
                           delimiter = ",",
                           skiprows = 1,
                           usecols = 1)  
diameter = np.loadtxt("result.txt",
                           delimiter = ",",
                           skiprows = 1,
                           usecols = 2)
ziel = np.array([2.5,2.5])
x1 = diameter * -0.5
x2 = diameter * 0.5
y1 = abs(depth) * -1
fig, ax= plt.subplots()
ax.plot(ziel * -0.5, y1)
ax.plot(ziel * 0.5, y1)
ax.fill_betweenx(y1, x1, x2, color="green", alpha=.3)
plt.show()
Nun wollte ich diesen in meinen GUI Code integrieren, das Problem ist allerdings, dass mit der Subplot "fill_between" in der Grafik nicht angezeit wird. Bei obigen Code wird dieser ja mit dem Befehl plt.show() abgerufen, bei dem darunterstehenden Code fehlt mir die Fantasie wie dies funktionieren kann:

Code: Alles auswählen

    def plotdsv(self, *args):
        self.fig = Figure(figsize = (3, 5), facecolor = "white")
        canvas = FigureCanvasTkAgg(self.fig, master=self)
        canvas.get_tk_widget().grid(column=9, row=1, rowspan=18)
        self.axis = self.fig.add_subplot(111)
        self.axis.set_xlabel("Durchmesser [m]")
        self.axis.set_ylabel("Tiefe [m]")
        okdsv = abs(self.ok_dsv.get())
        ukdsv = abs(self.uk_dsv.get())
        zield = abs(self.zield.get())
        uksensor = abs(self.wiredepth.get())
        self.axis.set_xlim([-zield,zield])
        self.axis.set_ylim([-ukdsv-1,0.75])
        self.axis.plot([0,0],[0.75,-uksensor], color = "green")
        self.axis.plot([-zield-2,zield+2],[0,0], color = "brown")       
        self.axis.plot([zield * -0.5, zield * 0.5, zield * 0.5, zield * -0.5, zield * -0.5],
                       [-okdsv, -okdsv, -ukdsv, -ukdsv, -okdsv],
                       "--", label = "DSV geplant", color = "blue") 
        if os.path.exists("result.txt"): 
            print ("file ist da")
            self.t_result = np.loadtxt("result.txt",
                               delimiter = ",",
                               skiprows = 1,
                               usecols = 1)  
            self.d_result = np.loadtxt("result.txt",
                               delimiter = ",",
                               skiprows = 1,
                               usecols = 2)
            self.axis.plot(self.d_result * -0.5, abs(self.t_result) * -1, color = "orange")
            self.axis.plot(self.d_result * 0.5, abs(self.t_result) * -1, color = "orange")
            with open ("result.txt") as file:
                linenumbers = len(file.readlines())
                print("es sind", linenumbers, "Zeilen")
            if linenumbers > 2:
                print("schraffur")
                y1 = abs(self.t_result) * -1
                x1 = self.d_result * -0.5
                x2 = self.d_result * 0.5
                self.axis.fill_between(y1, x1, x2, color = "green", alpha = .3)
            else:
                print("keine Schraffur") 
Vielleicht kann mir dabei jemand helfen??
fox1203
User
Beiträge: 56
Registriert: Montag 23. März 2020, 15:19

Fehler gefunden, hatte das x bei fill_between vergessen, daher wurde es nicht im gewünschten Wertebereich dargestellt
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@fox1203: Da wird ein bisschen sehr oft die Datei geladen. Wenn man daraus zwei Spalten braucht, dann lädt man die Datei nicht zwei mal. Und schon gar nicht ein drittes mal wenn man nur wissen will wie viele Zeilen die hat, wenn man die Daten selbst und damit die Längeninformation doch *bereits geladen hat*.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Du führst in einer Methode sehr viele Attribute ein. Ich hoffe, die wurden in __init__ bereits angelegt. okdsv.get lässt befürchten, dass die Methode mehrfach aufgerufen werden kann, da aber canvas kein Attribut ist, wie willst da Du vor dem nächsten plotten sauber aufräumen?
Benutze keine kryptischen Abkürzungen. uk ok dsv was? Und was soll das d an zield?
t_result und d_result enthalten nur Werte, wenn die Datei existiert. Das kann zu undurchsichtigen Verhalten an anderer Stelle führen.
Antworten