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

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
August1328
User
Beiträge: 65
Registriert: Samstag 27. Februar 2021, 12:18

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Damit https://matplotlib.org/stable/api/_as_g ... .xlim.html sollte das gehen. Einfach auf die 22 Uhr setzen.
August1328
User
Beiträge: 65
Registriert: Samstag 27. Februar 2021, 12:18

Super, Dankeschön! Das habe ich gesucht, werde ich die nächsten Tage einbauen und ne Rückmeldung geben.
Gruß
August1328
User
Beiträge: 65
Registriert: Samstag 27. Februar 2021, 12:18

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.
Antworten