#!/usr/bin/env gnuplot # Der folgende Quellcode ist gemeinfrei bzw. steht unter Liz. „CC0 1.0 Verzicht auf das Copyright“ # (gegen freundliche Nennung des Verbreitungsweges habe ich nat. keine Einwände) # Auszug der WHO Daten von https://covid19.who.int/WHO-COVID-19-global-data.csv als HereDoc mit Delimiter "EndOfData" # (als Separator wurde Komma durch Semikolon getauscht um Verwechslung zum deut. Dezimaltrenner zu vermeiden) # # 1. Spalte: Date_reported # 2. Spalte: Country_code # 3. Spalte: Country # 4. Spalte: WHO_region # 5. Spalte: New_cases # 6. Spalte: Cumulative_cases # 7. Spalte: New_deaths # 8. Spalte: Cumulative_deaths # $WHO_data << EndOfData EndOfData # input (Zeitformat und Separator definieren) # set timefmt "%Y-%m-%d" set datafile separator ';' # Variablen mit Statistikdaten setzen # (every ::0 steht für 'ab erster Zeile' und kann weggelassen werden) stats $WHO_data every ::0 usi 5 name "neuinf_einzelwerte" nooutput stats $WHO_data every ::0 usi 6 name "neuinf_kumuliert" nooutput stats $WHO_data every ::0 usi 7 name "tote_einzelwerte" nooutput stats $WHO_data every ::0 usi 8 name "tote_kumuliert" nooutput # Start und Ende ermitteln stats $WHO_data every ::0 usi (strptime("%Y-%m-%d",strcol(1))) name "datum" nooutput # label fuer Legende oben links mit den ermittelten Datumsintervall setzen set label 'Daten vom '.strftime("%d.%m.%Y",datum_min) at graph 0.28, graph 0.94 right set label 'bis '.strftime("%d.%m.%Y",datum_max) at graph 0.28, graph 0.85 right ##### Test ##### # Werte die per Configscript eingepatcht wurden: my_graph1_ytics = 10000 my_graph1_mytics = 5 my_graph2_ytics = 250 my_graph2_mytics = 5 my_grafik_type = 'Tote' # Kann den Wert 'Tote' o. 'Neuinfiektionen' annehmen my_graph1_ylabel = 'Tote (kumuliert)' my_graph2_ylabel = 'Tote' my_output_basename = 'COVID-19-Pandemie_-_DE_(Deutschland)_-_Tote_(800px)' # Die Maximalwerte für die obere und untere Grafik ermitteln. # Dazu muessen wir ermitteln ob es sich um eine Grafik von Neuinfizierten # oder Toten handelt. if (my_grafik_type eq 'Tote' ) { # wenn wir hier int() nehmen ist u.a. die Ausgabe via print einfacher # weil real weniger einfach auszugeben ist. my_graph1_max = int(tote_kumuliert_max) my_graph2_max = int(tote_einzelwerte_max) } else { my_graph1_max = int(neuinf_kumuliert_max) my_graph2_max = int(neuinf_einzelwerte_max) } # Hier soll zukünftig ytics und mtics berechent werden # # my_graph2_ytics und my_graph2_mytics # if ( my_graph1_max <=100000000*9 ) { my_graph1_ytics =100000000; my_graph1_mytics = 5} if ( my_graph1_max <= 50000000*9 ) { my_graph1_ytics = 50000000; my_graph1_mytics = 5} if ( my_graph1_max <= 25000000*9 ) { my_graph1_ytics = 25000000; my_graph1_mytics = 5} #if ( my_graph1_max <= 20000000*9 ) { my_graph1_ytics = 20000000; my_graph1_mytics = 4} if ( my_graph1_max <= 10000000*9 ) { my_graph1_ytics = 10000000; my_graph1_mytics = 5} if ( my_graph1_max <= 5000000*9 ) { my_graph1_ytics = 5000000; my_graph1_mytics = 5} if ( my_graph1_max <= 2500000*9 ) { my_graph1_ytics = 2500000; my_graph1_mytics = 5} #if ( my_graph1_max <= 2000000*9 ) { my_graph1_ytics = 2000000; my_graph1_mytics = 4} if ( my_graph1_max <= 1000000*9 ) { my_graph1_ytics = 1000000; my_graph1_mytics = 5} if ( my_graph1_max <= 500000*9 ) { my_graph1_ytics = 500000; my_graph1_mytics = 5} if ( my_graph1_max <= 250000*9 ) { my_graph1_ytics = 250000; my_graph1_mytics = 5} #if ( my_graph1_max <= 200000*9 ) { my_graph1_ytics = 200000; my_graph1_mytics = 4} if ( my_graph1_max <= 100000*9 ) { my_graph1_ytics = 100000; my_graph1_mytics = 5} if ( my_graph1_max <= 50000*9 ) { my_graph1_ytics = 50000; my_graph1_mytics = 5} if ( my_graph1_max <= 25000*9 ) { my_graph1_ytics = 25000; my_graph1_mytics = 5} #if ( my_graph1_max <= 20000*9 ) { my_graph1_ytics = 20000; my_graph1_mytics = 4} if ( my_graph1_max <= 10000*9 ) { my_graph1_ytics = 10000; my_graph1_mytics = 5} if ( my_graph1_max <= 5000*9 ) { my_graph1_ytics = 5000; my_graph1_mytics = 5} if ( my_graph1_max <= 2500*9 ) { my_graph1_ytics = 2500; my_graph1_mytics = 5} #if ( my_graph1_max <= 2000*9 ) { my_graph1_ytics = 2000; my_graph1_mytics = 4} if ( my_graph1_max <= 1000*9 ) { my_graph1_ytics = 1000; my_graph1_mytics = 5} if ( my_graph1_max <= 500*9 ) { my_graph1_ytics = 500; my_graph1_mytics = 5} if ( my_graph1_max <= 250*9 ) { my_graph1_ytics = 250; my_graph1_mytics = 5} #if ( my_graph1_max <= 200*9 ) { my_graph1_ytics = 200; my_graph1_mytics = 4} if ( my_graph1_max <= 100*9 ) { my_graph1_ytics = 100; my_graph1_mytics = 5} if ( my_graph1_max <= 50*9 ) { my_graph1_ytics = 50; my_graph1_mytics = 5} if ( my_graph1_max <= 25*9 ) { my_graph1_ytics = 25; my_graph1_mytics = 5} #if ( my_graph1_max <= 20*9 ) { my_graph1_ytics = 20; my_graph1_mytics = 4} if ( my_graph1_max <= 10*9 ) { my_graph1_ytics = 10; my_graph1_mytics = 5} # # # my_graph2_ytics und my_graph2_mytics # # Weil es in den Daten vom 2. Sep einen Ausreisser der USA-Daten nach oben # gab habe ich hier zwei 10erpotenzen drauf gelegt if ( my_graph2_max <=50000000*4 +30000000 ) { my_graph2_ytics =50000000; my_graph2_mytics = 5} if ( my_graph2_max <=25000000*4 +15000000 ) { my_graph2_ytics =25000000; my_graph2_mytics = 5} if ( my_graph2_max <=20000000*4 +10000000 ) { my_graph2_ytics =20000000; my_graph2_mytics = 4} if ( my_graph2_max <=10000000*4 + 6000000 ) { my_graph2_ytics =10000000; my_graph2_mytics = 5} if ( my_graph2_max <= 5000000*4 + 3000000 ) { my_graph2_ytics = 5000000; my_graph2_mytics = 5} if ( my_graph2_max <= 2500000*4 + 1500000 ) { my_graph2_ytics = 2500000; my_graph2_mytics = 5} if ( my_graph2_max <= 2000000*4 + 1000000 ) { my_graph2_ytics = 2000000; my_graph2_mytics = 4} if ( my_graph2_max <= 1000000*4 + 600000 ) { my_graph2_ytics = 1000000; my_graph2_mytics = 5} if ( my_graph2_max <= 500000*4 + 300000 ) { my_graph2_ytics = 500000; my_graph2_mytics = 5} if ( my_graph2_max <= 250000*4 + 150000 ) { my_graph2_ytics = 250000; my_graph2_mytics = 5} if ( my_graph2_max <= 200000*4 + 100000 ) { my_graph2_ytics = 200000; my_graph2_mytics = 4} if ( my_graph2_max <= 100000*4 + 60000 ) { my_graph2_ytics = 100000; my_graph2_mytics = 5} if ( my_graph2_max <= 50000*4 + 30000 ) { my_graph2_ytics = 50000; my_graph2_mytics = 5} if ( my_graph2_max <= 25000*4 + 15000 ) { my_graph2_ytics = 25000; my_graph2_mytics = 5} if ( my_graph2_max <= 20000*4 + 10000 ) { my_graph2_ytics = 20000; my_graph2_mytics = 4} if ( my_graph2_max <= 10000*4 + 6000 ) { my_graph2_ytics = 10000; my_graph2_mytics = 5} if ( my_graph2_max <= 5000*4 + 3000 ) { my_graph2_ytics = 5000; my_graph2_mytics = 5} if ( my_graph2_max <= 2500*4 + 1500 ) { my_graph2_ytics = 2500; my_graph2_mytics = 5} if ( my_graph2_max <= 2000*4 + 1000 ) { my_graph2_ytics = 2000; my_graph2_mytics = 4} if ( my_graph2_max <= 1000*4 + 600 ) { my_graph2_ytics = 1000; my_graph2_mytics = 5} if ( my_graph2_max <= 500*4 + 300 ) { my_graph2_ytics = 500; my_graph2_mytics = 5} if ( my_graph2_max <= 250*4 + 150 ) { my_graph2_ytics = 250; my_graph2_mytics = 5} if ( my_graph2_max <= 200*4 + 100 ) { my_graph2_ytics = 200; my_graph2_mytics = 4} if ( my_graph2_max <= 100*4 + 60 ) { my_graph2_ytics = 100; my_graph2_mytics = 5} if ( my_graph2_max <= 50*4 + 30 ) { my_graph2_ytics = 50; my_graph2_mytics = 5} if ( my_graph2_max <= 25*4 + 15 ) { my_graph2_ytics = 25; my_graph2_mytics = 5} if ( my_graph2_max <= 20*4 + 10 ) { my_graph2_ytics = 20; my_graph2_mytics = 4} if ( my_graph2_max <= 10*4 + 6 ) { my_graph2_ytics = 10; my_graph2_mytics = 5} if ( my_graph2_max <= 5*4 + 3 ) { my_graph2_ytics = 5; my_graph2_mytics = 5} # Intervall zwischen zwei Skalenstrichen berechnen. # Wir brauchen den Wert zum Berechnen von my_graph[1|2]_yrange_max my_graph1_ytics_quot = my_graph1_ytics / my_graph1_mytics my_graph2_ytics_quot = my_graph2_ytics / my_graph2_mytics # Max für yrange berechenen. # Derzeit wird die Variable nur für die untere Grafik (graph2) benztzt my_graph1_yrange_max = (floor(my_graph1_max / my_graph1_ytics_quot) +1) * my_graph1_ytics_quot my_graph2_yrange_max = (floor(my_graph2_max / my_graph2_ytics_quot) +1) * my_graph2_ytics_quot # Wenn my_graph[1,2]_max null ist, soll auf 10 bzw. 5 gesetzt werden. # Bei kleihnen Werten soll er 10 oder 20 (Graph1) bzw. 5 oder 10 (Graph2) # für Graph1 if (my_graph1_yrange_max < 10) {my_graph1_yrange_max = 10} else { if (my_graph1_yrange_max < 20) {my_graph1_yrange_max = 20} } # für Graph2 if (my_graph2_yrange_max < 5) {my_graph2_yrange_max = 5} else { if (my_graph2_yrange_max < 10) {my_graph2_yrange_max = 10} } ##### Ende Test ##### # Wir nehmen statt zweimal 'ylabel' zweimal 'label' # (bei multiplot ist es schwierig fuer alle Plots ein ylabel mit gleichen seitl. Einzug zu finden) set label my_graph1_ylabel at screen 0.017, 0.700 rotate by +90 center set label my_graph2_ylabel at screen 0.017, 0.300 rotate by +90 center # output # # Name der SVG-Datei set output my_output_basename . '.svg' unset key # keine Box fuer Legende set border 3 # Rahmen unten (Bit 1) und links (+ Bit 2) set xtics scale 0.7, 0.4 # Skalenstriche x-Achse etwas kleiner set ytics scale 0.7, 0.4 # Skalenstriche y-Achse etwas kleiner set ytics offset 0.4, 0.0 # Zahlen eine Idee nach rechts (mehr Abstand vom Label) # 'Wasserzeichen' für Dublettenprüfung bei commons set label 'DE' at screen 0.01, 0.02 textcolor rgb '#ffffff' font 'Arial,8' # Gitterlinienen per Hand setzen set style line 1 linetype rgb '#4f4f4f' linewidth 0.25 # Def. Major-grid set style line 2 linetype rgb '#9f9f9f' linewidth 0.20 # def. Minor-grid unset grid set grid noxtics nomxtics # Keine Gitterlinen an der 1. X-Achse (Monate) set grid x2tics nomx2tics # Gitterliniene an der 2. X-Achse (Kalenderwochen) set grid ytics mytics # Gitterl. an der Y-Achse set grid back # Gitter im Hintergrund set grid linestyle 1, linestyle 2 # Setzen des linestyle fuer Major u. Minor # X-Achsenbeschriftung: # ueber x1 machen wir die Monatsbschriftung, ueber x2 die Kalenderwochenbeschriftung # # beide X-Achsen, also x1 und x2, als Zeitachse definieren set xdata time set x2data time # Bereich (von - bis) der X-Achse definieren # Beginnt am 1. Jan. 2020 und Edit heute plus 6 Tage xrange_max=strftime("%Y-%m-%d", time(0) + (60*60*24*6)) # zuvor Berechnetes xrange_max setzten set xrange ['2020-01-01': xrange_max] set x2range ['2020-01-01': xrange_max] # die Maker fuer Monat setzen wir per Hand. Als 'format' geben wir einen leeren String an damit # kein Text generiert wird (fuer die untere Grafik setzen wir den Text spaeter) set xtics format "" # Format auf Nichts damit gnuplot die folgenden Daten nicht aufloest set xtics ( "2020-01-01" \ , "2020-02-01" \ , "2020-03-01" \ , "2020-04-01" \ , "2020-05-01" \ , "2020-06-01" \ , "2020-07-01" \ , "2020-08-01" \ , "2020-09-01" \ , "2020-10-01" \ , "2020-11-01" \ , "2020-12-01" \ , "2021-01-01" \ , "2021-02-01" \ , "2021-03-01" \ , "2021-04-01" \ , "2021-05-01" \ , "2021-06-01" \ , "2021-07-01" \ , "2021-08-01" \ , "2021-09-01" \ , "2021-10-01" \ , "2021-11-01" \ , "2021-12-01" \ , "2022-01-01" \ , "2022-02-01" \ , "2022-03-01" \ , "2022-04-01" \ , "2022-05-01" \ , "2022-06-01" \ , "2022-07-01" \ , "2022-08-01" \ , "2022-09-01" \ , "2022-10-01" \ , "2022-11-01" \ , "2022-12-01" \ , "2023-01-01" \ , "2023-02-01" \ , "2023-03-01" \ , "2023-04-01" \ , "2023-05-01" \ , "2023-06-01" \ , "2023-07-01" \ , "2023-08-01" \ , "2023-09-01" \ , "2023-10-01" \ , "2023-11-01" \ , "2023-12-01" \ , "2024-01-01" \ ) # # Kalenderwochen-Striche # # fuer x2 (KW) ebendalls keine Beschriftung set format x2 '' # der 6. Jan. 2020 war ein Montag - da setzen wir den ersten Strich und die # folgenden Striche alle 7 Tage (hier in 60 * 60 * 24 * 7 Sekunden) set x2tics '2020-01-06', 60 * 60 * 24 * 7 set x2tics scale 0 set xtics nomirror unset mxtics # Format Y-Achse set decimalsign locale "de_DE.utf8" set format y "%'.0f" set yrange [-2000 : *] set ytics 10000 set mytics 5 set ytics nomirror # hier drüber wurden Werte für yrange, ytics und mytics eingepatcht. Nach # Umstellung auf 'autonom' berechtete Werte sieht es so aus: set yrange [ - my_graph1_ytics_quot : my_graph1_yrange_max ] set ytics my_graph1_ytics set mytics my_graph1_mytics # Zebramuster set style rect fillcolor lt -1 fillstyle solid 0.06 noborder do for [i=1:12:2] { # Marker für 2020 marker_start=sprintf("2020-%1.2d-01",i) marker_stop =sprintf("2020-%1.2d-01",i+1) set object rectangle from marker_start,graph 0 to marker_stop, graph 1 # Marker für 2021 marker_start=sprintf("2021-%1.2d-01",i) marker_stop =sprintf("2021-%1.2d-01",i+1) set object rectangle from marker_start,graph 0 to marker_stop, graph 1 # Marker für 2022 marker_start=sprintf("2022-%1.2d-01",i) marker_stop =sprintf("2022-%1.2d-01",i+1) set object rectangle from marker_start,graph 0 to marker_stop, graph 1 # Marker für 2023 marker_start=sprintf("2023-%1.2d-01",i) marker_stop =sprintf("2023-%1.2d-01",i+1) set object rectangle from marker_start,graph 0 to marker_stop, graph 1 # # hier Code rechtzeitig ergaenzen falls Pandemie lange andauert! } # Groesse, Schrift und SVG-Name definieren # (der SVG-Name wird auf Infoseite bei Commons ausgegeben) # # Zur Variablen 'datum_max' siehe oben my_svg_name = strftime("COVID_%d_%m_%Y_DE",datum_max) set term svg size 800,450 font "Arial,16" name my_svg_name ########################################################################################### # 03.04.2021 Damit 9stellige Zahlen nicht das YLable überschreiben die Werte [l|r]magin von # 10.0/1.0 nach 10.6/0.4 verschoben set lmargin 10.6 # linker Rand fuer Beschriftung Y-Achse sollte nicht auf Auto stehen set rmargin 0.4 # rechter Rand set tmargin 1.0 # top margin set bmargin 0.0 # bottom margin set multiplot # Ausgabe oberer Graph set size 1.000, 0.550 # Groesse der Grafik set origin 0.000, 0.450 # def. der linken unteren Ecke unset xlabel plot $WHO_data usi 1:8 axis x1y1 tit 'Kumulierte Werte' lt rgb '#700070' lw 1.75 with lines # Ausgabe unterer Graph set tmargin 0.4 # Wert von oben ueberschreiben damit Grafiken enger zusammen unset bmargin # oben wurde bottommargin auf null gesetzt - jetzt wieder auto damit Platz fuer Skala unset label # set size 1.000, 0.450 set origin 0.000, 0.000 # Wenn das Datumsintervall so gross wird das die Labels zu eng gesetzt sind # hier jeden zweiten Eintrag loeschen! # Anmerkung: vor den fetten Jahreszahlstrings hatten wir bis zum # 23. April 2023 drei Leerzeichen damit der linksbündige String # die gl. Laenge wie die Monatsstrings haben. Aufgrund des unregelmaessig # auftretenden Renderer-Fehlers bei commons auf ein Leerz. reduziert. set xtics rotate by +35 center offset -1.5,-0.6 set xtics add ( " {/:Bold 2020}" "2020-01-01" \ , "1. März" "2020-03-01" \ , " 1. Mai" "2020-05-01" \ , "1. Jul." "2020-07-01" \ , "1. Sep." "2020-09-01" \ , "1. Nov." "2020-11-01" \ , " {/:Bold 2021}" "2021-01-01" \ , "1. März" "2021-03-01" \ , " 1. Mai" "2021-05-01" \ , "1. Jul." "2021-07-01" \ , "1. Sep." "2021-09-01" \ , "1. Nov." "2021-11-01" \ , " {/:Bold 2022}" "2022-01-01" \ , "1. März" "2022-03-01" \ , " 1. Mai" "2022-05-01" \ , "1. Jul." "2022-07-01" \ , "1. Sep." "2022-09-01" \ , "1. Nov." "2022-11-01" \ , " {/:Bold 2023}" "2023-01-01" \ , "1. März" "2023-03-01" \ , " 1. Mai" "2023-05-01" \ , "1. Jul." "2023-07-01" \ , "1. Sep." "2023-09-01" \ , "1. Nov." "2023-11-01" \ , " {/:Bold 2024}" "2024-01-01" \ ) set xlabel "Datum (Monats- und KW-Skala)" # set yrange [-50 : *] # set yrange [-50 : my_graph2_yrange_max] set yrange [ - my_graph2_ytics_quot : my_graph2_yrange_max] set ytics my_graph2_ytics set mytics my_graph2_mytics # Ueber den Wert von lw kann man die Sichtbarkeit bei kl. Aufl. regulieren plot $WHO_data usi 1:7 axis x1y1 tit 'Einzelwerte' lt rgb '#700070' lw 0.75 with impulses unset multiplot # Ausgabe zur Diagnose auf Console: print 'barbeite: ' . my_output_basename # Ausgabe zur Diagnose auf Error-Console set print my_output_basename . '.err' print my_output_basename print ' ----- Stats --------------' print ' Start: ', strftime("%d. %B %Y",datum_min) print ' Ende: ', strftime("%d. %B %Y",datum_max) print ' Infizierte: Min: ', int(neuinf_einzelwerte_min), ' Max: ', int(neuinf_einzelwerte_max), ' KumMax: ', int(neuinf_kumuliert_max) print ' Tote: Min: ', int(tote_einzelwerte_min), ' Max: ', int(tote_einzelwerte_max) , ' KumMax: ', int(tote_kumuliert_max) print ' --------------------------' print ' my_graph1_ylabel = ' . my_graph1_ylabel print ' my_graph1_ytics = ' . my_graph1_ytics print ' my_graph1_mytics = ' . my_graph1_mytics print ' my_graph1_ytics_quot = ' . my_graph1_ytics_quot print ' my_graph1_max = ' . my_graph1_max print ' my_graph1_yrange_max = ' . my_graph1_yrange_max print ' my_graph2_ylabel = ' . my_graph2_ylabel print ' my_graph2_ytics = ' . my_graph2_ytics print ' my_graph2_mytics = ' . my_graph2_mytics print ' my_graph2_ytics_quot = ' . my_graph2_ytics_quot print ' my_graph2_max = ' . my_graph2_max print ' my_graph2_yrange_max = ' . my_graph2_yrange_max print ' my_grafik_type = ' . my_grafik_type