matplotlib achsenschrittweite festlegen

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
rennmaus
User
Beiträge: 217
Registriert: Dienstag 4. August 2020, 10:24

Hallo zusammen,
Folgendes Problem:
Bei folgendem Code, wird das Budget komisch angezeigt, bzw. nicht so wie ich es mir vorstelle. Ich möchte nämlich, dass die Schrittweite festgelegt ist und sich nicht an den Punkten orientiert die ich ihr gebe.

Code: Alles auswählen

import matplotlib.pyplot as pyplot

JAHR = []
BUDGET = []

with open('C:/Users/chris/Desktop/PyChris/Butterbrot.txt') as f:
    for line in f.readlines():
        zeile=line
        zeile=zeile.split('/')
        jahr=zeile[0]
        budget=zeile[2]
        budget=budget.replace('\n', '')
        JAHR.append(jahr)
        BUDGET.append(budget)

pyplot.plot(JAHR, BUDGET)

pyplot.xlabel('Jahre')
pyplot.ylabel('Budget')

pyplot.show()
Mein File sieht so aus:

Code: Alles auswählen

2020-08-15/Amazon echo dot Ebay/85.45
2020-08-15/Denon Ebay/123.45
2020-08-22/Tomtom Ebay/126.15
(Das ist ein ausschnitt) Jetzt möchte ich, dass das Budget auf der y-Achse festgelegt ist, sodass sich das nicht immer verschiebt, ihr könnt es ja auch mal ausprobieren, vielleicht wird es dann klar was ich meine.

Mfg
Christian
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@rennmaus: Das mit den Preisen funktioniert so nicht. Nimm noch mal einen Artikel für 1,99 in die Beispieldaten auf und schau mal wo das dann in der Grafik landet:

Code: Alles auswählen

2020-08-15/Amazon echo dot Ebay/85.45
2020-08-15/Denon Ebay/123.45
2020-08-22/Tomtom Ebay/126.15
2020-08-24/Diskettenlocher Ebay/1.99
Bild
Wohl nicht da wo man es erwarten würde, weder von der Reihenfolge, noch was die Abstände zwischen den Preisen angeht.

Du musst die Daten schon im richtigen Datenformat übergeben. Preise sind halt keine Zeichenketten.

Was auch so komisch ist, sind mehr als ein Preis pro Datum. Das kann man in einem Scatterplot machen, aber nicht in einem Liniendiagramm.

Auch die Abstände zwischen den Datumsangaben sind natürlich falsch wenn man da Zeichenketten verwendet und Matplotlib nicht berechnen kann wie gross der Abstand ist.

``as`` beim Importieren ist zum umbenennen gedacht, `pyplot` wird aber gar nicht umbenannt.

Die Namenskonventionen solltest Du doch mittlerweile kennen. KOMPLETT_GROSS ist für Konstanten. Die Daten die da geplottet werden sollen sind keine.

`jahr` ist als Name falsch, weil da Datumsangaben mit Monat und Tag gespeichert werden, und nicht nur Jahre. Ach so: Mehrzahl, das müsste wenn dann auch `jahre` heissen. Auch bei `budget` bin ich mir nicht sicher ob das hier ein passender Name für Einzelpreise ist‽

`f` ist kein guter Name. `file` oder `datei` wäre passend. Der `readlines()`-Aufruf ist überflüssig und lädt nur unnötigerweise alle Zeilen in den Arbeitsspeicher bevor darüber iteriert wird. Dateiobjekte sind iterierbare Objekte, die die einzelnen Zeilen liefern. Und zwar ohne die Datei erst komplett einzulesen. Dann kann man `f` auch gleich `zeilen` nennen.

Die Umbenennung von `line` in `zeile` ist sinnfrei. Warum nennst Du das nicht gleich so wie es am Ende heissen soll, statt den Wert erst an `line` zu binden, nur um gleich in der nächsten Zeile den selben Wert an `zeile` zu binden und `line` nie wieder zu verwenden?

Statt das Zeilenendezeichen irgendwann nach dem Zerlegen der Zeile von einem Einzelbestandteil zu entfernen, ist es weniger fehleranfällig und nachvollziehbarer das gleich am Anfang zu machen, bevor man die Zeile weiterverarbeitet. Und auch nicht mit `replace()`, was ja das Zeichen das nur am Ende vorkommen *kann*, in der *ganzen* Zeile sucht und ersetzt. Um Zeichen an den Enden einer Zeichenkette zu entfernen gibt es die Methoden der `strip()`-Familie: `strip(), `lstrip()`, und `rstrip()`.

Man muss auch nicht jedes kleine Zwischenergebnis an einen Namen binden.

Zwischenstand:

Code: Alles auswählen

#!/usr/bin/env python3
from datetime import datetime as DateTime

from matplotlib import pyplot


def main():
    daten = []
    preise = []
    with open("test.txt") as zeilen:
        for zeile in zeilen:
            datum_text, _, preis_text = zeile.rstrip().split("/")
            daten.append(DateTime.strptime(datum_text, "%Y-%m-%d"))
            preise.append(float(preis_text))

    pyplot.plot(daten, preise)
    pyplot.gcf().autofmt_xdate()
    pyplot.xlabel("Jahre")
    pyplot.ylabel("Budget")
    pyplot.show()


if __name__ == "__main__":
    main()
Sieht schon besser aus, aber das es mehrere Datenpunkte für ein Datum gibt, ist natürlich immer noch ein Problem für ein Liniendiagramm:
Bild
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
rennmaus
User
Beiträge: 217
Registriert: Dienstag 4. August 2020, 10:24

Ich kann ja ein bisschen Schummeln und die Daten ein wenig ändern, dass es keine zwei Informationen an einem Datum gibt... Danke!
Ich lerne immer so schön viel bei dir ;)
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Oder kein Linendiagramm machen sondern einen Scatterplot. Oder man muss die Daten für gleiche Datumsangaben addieren.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten