Sinnvolle Ticks

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
PythonVomJupyter
User
Beiträge: 8
Registriert: Sonntag 12. Juli 2020, 16:53

Hallo liebe Python-Community,

ich bin absoluter blutiger Anfänger was das Programmieren angeht. Ich habe eine Aufgabe bei der ich (für euch) ziemlich einfache Grafiken erstellen soll und habe hier leider Formatierungsprobleme.

Konkret habe ich folgende Grafik aus einer .csv erstellt:

Bild

plt.figure(figsize=(10, 6), dpi=80)
plt.plot(Germany['Date'], Germany['Confirmed'],'g', label="Germany");
plt.plot(Italy['Date'], Italy['Confirmed'],'r', label="Italy");
plt.plot(Germany['Date'], France['Confirmed'],'y', label="France");
plt.title('Infektionen', fontsize='16');
plt.legend(loc='upper left', fontsize='12');
plt.xlabel('Datum')
plt.ylabel('Infektionen');

Ich würde hier gerne sinnvollere Ticks auf der X-Achse setzen aber auch nach ewigem recherchieren kriege ich es leider nicht gebacken.

Könnt Ihr mir bitte dabei helfen?

Vielen Dank im Voraus :)

Grüße
Sirius3
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

Es sieht nichts so aus als ob die Date-Felder tatsächlich ein Datum enthalten. Wie liest du denn die Daten? Warum werden französische Fälle mit deutschem Datum geplottet?
PythonVomJupyter
User
Beiträge: 8
Registriert: Sonntag 12. Juli 2020, 16:53

Sirius3 hat geschrieben: Sonntag 12. Juli 2020, 18:54 Es sieht nichts so aus als ob die Date-Felder tatsächlich ein Datum enthalten. Wie liest du denn die Daten? Warum werden französische Fälle mit deutschem Datum geplottet?
Danke für deine Antwort

Also die Ticks auf der X-Achse sind mit dem jeweiligen Datum im Format YYYY-MM-DD beschriftet. Leider mit sämtlichen Tagen von Dezember2019 bis Mai2020. Dadurch dass sie in der Grafik übereinander sind verschwimmt alles zu einem einzigen schwarzen Block :(
Ich würde gerne die Ticks zB für jeden ersten des Monats oder so setzen damit man diese auch lesen kann.

Bei der Grafik wollte ich ganz simpel die Fälle aus Deutschland, Frankreich und Italien miteinander vergleichen. Für alle Länder wurden die Daten an den selben Tagen erhoben. Ich hoffe ich habe dich richtig verstanden.
Sirius3
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hatte die Frage nicht beantwortet: wie liest du die Daten ein?
Es hilft nichts, Datumswerte als Strings zu haben. Du musst sie in Datumsobjekte umwandeln.
PythonVomJupyter
User
Beiträge: 8
Registriert: Sonntag 12. Juli 2020, 16:53

Sirius3 hat geschrieben: Sonntag 12. Juli 2020, 20:58 Du hatte die Frage nicht beantwortet: wie liest du die Daten ein?
Es hilft nichts, Datumswerte als Strings zu haben. Du musst sie in Datumsobjekte umwandeln.
Die Daten wurden wie folgt eingelesen:

import os
for dirname, _, filenames in os.walk('../Daten/covid.csv'):
for filename in filenames:
print(os.path.join(dirname, filename))

df = pd.read_csv("../Daten/covid.csv")

Germany=df.iloc[14404:14461]
Italy=df.iloc[15544:15601]
France=df.iloc[14164:14221]

Danke!
Sirius3
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

Das os.walk ist doch völlig witzlos, wenn Du exakt einen Dateinamen angibst (würde man sonst heutzutage mit pathlib.Path.rglob lösen).
Woher kommen denn die Nummern? Woher weißt Du, was Germany, Italy oder France zuzuordnen ist?

Beim Lesen mit read_csv mußt Du noch angeben, welche Spalten das Datum enthalten.
PythonVomJupyter
User
Beiträge: 8
Registriert: Sonntag 12. Juli 2020, 16:53

Sirius3 hat geschrieben: Montag 13. Juli 2020, 09:52 Das os.walk ist doch völlig witzlos, wenn Du exakt einen Dateinamen angibst (würde man sonst heutzutage mit pathlib.Path.rglob lösen).
Woher kommen denn die Nummern? Woher weißt Du, was Germany, Italy oder France zuzuordnen ist?
Die Nummern sind die Zeilennummern die ich aus der Excel Datei abgelesen habe. Ist wohl ziemlich stümperhaft gelöst aber es fällt mir eh schwer mich mit dem Thema ohne Kurs auseinanderzusetzen :|
Sirius3 hat geschrieben: Montag 13. Juli 2020, 09:52 Beim Lesen mit read_csv mußt Du noch angeben, welche Spalten das Datum enthalten.
Ich habe leider keine Ahnung wie ich das machen kann :cry:
Kannst du mir dabei helfen?
Sirius3
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

Hast Du schon die Dokumentation zu read_csv gelesen?
PythonVomJupyter
User
Beiträge: 8
Registriert: Sonntag 12. Juli 2020, 16:53

Sirius3 hat geschrieben: Montag 13. Juli 2020, 12:44 Hast Du schon die Dokumentation zu read_csv gelesen?
Ja, ich habe es zumindest versucht...
Sirius3
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

Und eine der vielen Optionen ist parse_dates, die dazu da ist, Daten zu parsen.
PythonVomJupyter
User
Beiträge: 8
Registriert: Sonntag 12. Juli 2020, 16:53

Nochmal danke für dein Hilfe Sirius3, leider komme ich trotzdem überhaupt nicht weiter.

So wie ich das jetzt verstanden habe, müssen vorab erst mal folgende Schritte erfüllt sein, bevor die Ticks letztendlich angepasst werden können:

1. Beim Lesen mit read_csv angeben, welche Spalten das Datum enthalten
2. Strings in Datumsobjekte umwandeln z.B. mit parse_dates
(Falls nicht zutreffend, bitte korrigieren)

Jetzt weiß ich zwar WAS vorab unternommen werden muss, aber das WIE bleibt leider noch unbeantwortet. Genauso wie dann am Ende die Ticks angepasst werden sollen.

Es wäre daher super, wenn du mir zu den oben genannten Schritten bis hin zum Anpassen der Ticks jeweils ein konkretes Beispiel geben könntest.
Sirius3
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

Um das WIE wirklich beantworten zu können, müßte man den Aufbau der Datei kennen.
Wenn man raten müßte:

Code: Alles auswählen

df = pd.read_csv("../Daten/covid.csv", parse_dates=["Date"])
tonikae
User
Beiträge: 90
Registriert: Sonntag 23. Februar 2020, 10:27

Um die X-Achse eines Plots zu skalieren, nutzt man üblicherweise: Set_xticks
Alles weitere dazu gibt es hier.
htps://matplotlib.org/3.2.2/api/_as_gen/matplotlib.axes.Axes.set_xticks.html

Die Beschriftung einzelner Ticks mit bestimmten Angaben(das müssen nicht nur Zahlenwerte
sein, sondern können auch beliebige Texte sein) kann man mit get:_xtickslabels machen
Auch hierzu steht alles hier:
https://matplotlib.org/3.2.2/api/_as_ge ... ticks.html
Sirius3
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

@tonikae: die Mühe macht man sich aber erst, wenn das was automatisch erzeugt wird, nicht überzeugt. Der OP muss aber erst einmal die Daten richtig einlesen, und dann den Automatismus verwenden, um zu wissen, wie es eigentlich funktioniert.
PythonVomJupyter
User
Beiträge: 8
Registriert: Sonntag 12. Juli 2020, 16:53

Vielen Dank nochmals für die Antworten!

Die Datei ist wie folgt aufgebaut:

Bild

Ich hoffe das hilft weiter.

Danke
Benutzeravatar
sparrow
User
Beiträge: 4535
Registriert: Freitag 17. April 2009, 10:28

Dann hat Sirius3 ja richtig geraten.
Hast du es ausprobiert?
Benutzeravatar
__blackjack__
User
Beiträge: 14028
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wenn in der ersten Spalte das Land steht, dann verstehe ich nicht so ganz warum man das nicht zur Auswahl verwendet, statt da magische Indexwerte und `iloc` zu verwenden‽
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
PythonVomJupyter
User
Beiträge: 8
Registriert: Sonntag 12. Juli 2020, 16:53

Liebe Leute,

vielen Dank euch allen!

Es hat jetzt geklappt. Wir ihr merkt hat mir ein gewisses Grundverständnis gefehlt.

Der Tipp von Sirius3 hat geholfen. Es hat jetzt geklappt und allmälich verstehe ich auch was ich davor für einen Käse fabriziert hab.

Also danke nochmals an alle!

Besonderer Dank an Sirius3

Ihr habt mir sehr geholfen :)
Benutzeravatar
DeaD_EyE
User
Beiträge: 1231
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Wo ist denn die Quelle? Es sieht so aus, dass die Sterbefälle Kumulativ sind und das ist falsch.
Eigentlich würde eine Auswertung so aussehen.

Bild
Quelle: https://archive.server101.icu/covid19/s ... land.ipynb

Mit dem Code habe ich mir nicht besonders viel Mühe gegeben. Das einzige Ziel war es diesen blöden Graphen zu erstellen, damit ich die Grafik jedem unter die Nase halten kann, der mir mit Covid19 auf den Sack geht.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
__blackjack__
User
Beiträge: 14028
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DeaD_EyE: Was haben denn die *Sterbefälle* von 2016 bis 2020 mit den *Infektionszahlen* zu tun‽

Und kumulativ ist auch nicht falsch, sondern hängt davon ab ob man sehen möchte wie viele Infektionen insgesamt bekannt sind, oder ob man sehen möchte wie viele an den einzelnen Tagen gemeldet wurden. Beides sind sinnvolle Darstellungen.

Guter Graph zum Thema ist IMHO https://public.flourish.studio/visualisation/2562261/

Der Newcomer Covid-19 startet erst verspätet, kämpft sich dann aber tapfer und ausdauernd an die Spitze…
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten