Seite 1 von 1

pyplot mit fester zeitlicher x-Achse schrittweise füllen?

Verfasst: Donnerstag 9. November 2023, 19:05
von August1328
Guten Abend zusammen,

ich probiere gerade etwas neues für mein Trading Skript. Ich möchte einen Teil der Kennzahlen grafisch anzeigen lassen, also habe ich mich mit matplotlib / pyplot beschäftigt und bekomme fast alles hin, was ich mir vorstelle, fast :roll:

Ich habe ne simple Grafik mit je 1 Linie für Calls und Puts, 3 farbig und 3 Horizontalen drin, die Grafik blockiert das eigentliche Skript nicht mehr und aktualisiert sich brav alle 2 Minuten, wenn neue Daten hinzugekommen sind.

Einziger Schönheitsfehler ist noch, daß die Daten momentan gleichmäßig über die ganze Breite verteilt werden, was es zu Beginn schwer leserlich macht. Die x-Achse soll von 15:30h bis 22:00 Uhr gehen und in 2 Minuten Schritten nach rechts gefüllt werden, so wie sich ein anfangs leeres Aktien Chart im Laufe eines Handelstages füllt.

Ich habe bisher nach verschiedenen englischen Begriffen in diesem Zusammenhang gesucht wie predefined x axis, range x axis, fill up... usw. aber finde keinen passenden Link zu ner Doku oder nen Beispiel. Es gibt schon Beispiele, in denen eine Grafik schrittweise gefüllt wird, aber da sind die Werte für die x-Achse im df schon komplett vorhanden, bei mir füllen die sich ja erst. Wenn ich diese Werte aus nem andere df nehmen, meckert Python, daß x-Achse und die bisher vorhandenen y-Werte nicht zusammen passen, verständlich. Wenn ich die nicht vorhandenen y-Werte mit z.B. 0 fülle, sieht es halt nicht schön aus :lol:

Kennt jemand die richtige Stelle in der Doku oder nen Beispiel Code? Die Funktion sieht bisher so aus:

Code: Alles auswählen

def plot_rkz(df_calls: DataFrame, df_puts: DataFrame):
    """ RKZ plotten & updaten, wenn neue Daten vorhanden (aus func barupdate) """

    df_calls_today = df_calls[df_calls['date'].dt.date == Timestamp.today().date()]
    df_puts_today = df_puts[df_puts['date'].dt.date == Timestamp.today().date()]

    if len(df_calls_today.index) == len(df_puts_today.index): # nur plot, wenn len dfs gleich

        plt.rcParams["figure.figsize"] = (14,5)
        plt.clf()

        plt.ylabel("RKZ")
        plt.margins(0)
        plt.axhline(y=30, color='k', linestyle='--', alpha=0.4)
        plt.axhline(y=50, color='k', linestyle='-', alpha=0.8)
        plt.axhline(y=70, color='k', linestyle='--', alpha=0.4)
        plt.axhspan(ymin=10, ymax=45, facecolor='red', alpha=0.2)
        plt.axhspan(ymin=45, ymax=53, facecolor='yellow', alpha=0.2)
        plt.axhspan(ymin=53, ymax=90, facecolor='green', alpha=0.2)

        werte_x_achse = df_calls_today.index.strftime('%H:%M')
        plt.plot(werte_x_achse, df_calls_today['RKZ'], color="green")
        plt.plot(werte_x_achse, df_puts_today['RKZ'], color="red")

        plt.ion()
        plt.show()
        plt.pause(120)
Danke im voraus & Gruß, Andy

Re: pyplot mit fester zeitlicher x-Achse schrittweise füllen?

Verfasst: Donnerstag 9. November 2023, 21:54
von __deets__
Damit https://matplotlib.org/stable/api/_as_g ... .xlim.html sollte das gehen. Einfach auf die 22 Uhr setzen.

Re: pyplot mit fester zeitlicher x-Achse schrittweise füllen?

Verfasst: Donnerstag 9. November 2023, 22:42
von August1328
Super, Dankeschön! Das habe ich gesucht, werde ich die nächsten Tage einbauen und ne Rückmeldung geben.
Gruß

Re: pyplot mit fester zeitlicher x-Achse schrittweise füllen?

Verfasst: Montag 13. November 2023, 16:52
von August1328
So, ich konnte das heute mit Live-Daten testen und es hat auf Anhieb geklappt :D

Zu xlim() steht in der matplotlib Doku nicht allzuviel drin, habe deshalb noch nach ein paar Beispielen gesucht und eine Erläuterung gefunden, daß xlim() auch Datum/Uhrzeit annimmt und wenn die x-Werte ebenfalls in diesem Format sind, dann macht matplotlib die richtige Zuordnung.

Zum Code, es ändert sich die Zeile zu den x-Werten und es kommen neue Zeilen für xlim() hinzu. Kann man sicher kürzer machen, aber zum Verstehen lasse ich mal so:

Code: Alles auswählen

        werte_x_achse = df_calls_today['date']
        
        heutiges_datum = date.today()
        fuenfzehn_uhr_dreissig = time(hour=15, minute=30)
        zweiundzwanzig_uhr = time(hour=22, minute=00)
        heute_startzeit = datetime.combine(heutiges_datum, fuenfzehn_uhr_dreissig)
        heute_endzeit = datetime.combine(heutiges_datum, zweiundzwanzig_uhr)
        plt.xlim(left=heute_startzeit, right=heute_endzeit)
Danke an __deets__ für den richtigen Hinweis.