Seite 1 von 1

Matplotlib tkinter - fill_between

Verfasst: Sonntag 11. Oktober 2020, 22:26
von fox1203
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??

Re: Matplotlib tkinter - fill_between

Verfasst: Sonntag 11. Oktober 2020, 23:08
von fox1203
Fehler gefunden, hatte das x bei fill_between vergessen, daher wurde es nicht im gewünschten Wertebereich dargestellt

Re: Matplotlib tkinter - fill_between

Verfasst: Sonntag 11. Oktober 2020, 23:47
von __blackjack__
@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*.

Re: Matplotlib tkinter - fill_between

Verfasst: Montag 12. Oktober 2020, 05:52
von Sirius3
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.