@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

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:
