{"id":4093,"date":"2024-01-09T20:28:41","date_gmt":"2024-01-09T19:28:41","guid":{"rendered":"https:\/\/cbrell.de\/blog\/?p=4093"},"modified":"2024-01-09T20:54:10","modified_gmt":"2024-01-09T19:54:10","slug":"svg-diagramm-erzeugen-mit-python-und-c-im-vergleich","status":"publish","type":"post","link":"https:\/\/cbrell.de\/blog\/svg-diagramm-erzeugen-mit-python-und-c-im-vergleich\/","title":{"rendered":"SVG Diagramm erzeugen mit Python und C# im Vergleich"},"content":{"rendered":"<p><em>Gerade im <a href=\"https:\/\/cbrell.de\/blog\/was-ist-iot-internet-of-things\/\">IoT-Umfeld<\/a> nehmen die Datenmengen gerne schwindelerregende Umf\u00e4nge an. Die einzige Chance, den \u00dcberblick zu behalten, ist eine geeignete Datenvisualisierung. Der erste Schritt bei Zeitreihendaten ist die Erstellung einer Infografik in Form eines xy-Liniendiagramms. Dazu sind grunds\u00e4tzlich keine Grafiktools notwendig, eine einfaches in Python oder C# geschriebenes Programm gen\u00fcgt. Um absch\u00e4tzen zu k\u00f6nnen, welche Programmierumgebung angenehmer ist, sind hier der Python- und der C#-Quellcode f\u00fcr das gleiche Ergebnis dargestellt.<\/em><\/p>\n<p>09.01.2024<\/p>\n<h2>Das Anwendungsszenario<\/h2>\n<p>Das Beispiel verwendet Daten, die von einer <a href=\"https:\/\/cbrell.de\/blog\/vergleichstest-shelly-plug-s-shelly-1pm-und-plus-1pm\/\">WLAN-Steckdose<\/a> gesammelt und im Internet gespeichert werden. Daten f\u00fcr bis zu drei Tagen sind \u00fcber einen Webservice im CSV-Format ladbar. Die Daten enthalten einen Unix-Zeitstempel, einen menschenlesbaren Zeitstring, die jeweils aktuelle durch die WLAN-Steckdose gemessene Leistung in Watt und die \u00fcber die Zeit kumulierte\u00a0 (integrierte) Leitung sprich Energie in Kilo-Wattstunden.<\/p>\n<p>Aus den Daten wird eine x-y-Liniengrafik erzeugt und auf der eigenen Festplatte abgespeichert. Das Programm wurde zun\u00e4chst mit Python entwickelt und dann &#8211; m\u00f6glichst eins zu eins &#8211; in Dot Net C# umgesetzt. Das f\u00fchrt zu einem wenig sch\u00f6nen C#-Code, l\u00e4sst aber den Vergleich zwischen Python und C# als Programmiersprachen zu.<\/p>\n<p>Pers\u00f6nliche Wertung (Achtung subjektiv): Nach einigen Experimenten mit solchen ETL-Prozessen bin ich f\u00fcr mich zum Schluss gekommen, dass ich mit Python schneller zu einem brauchbaren Ergebnis gelange. Dabei bin ich weder Python- noch C# \/ Dot Net Fan.<\/p>\n<h2>Die erzeugte Grafik<\/h2>\n<p><a href=\"https:\/\/cbrell.de\/blog\/wp-content\/uploads\/2024\/01\/liniengrafikDotNet-screenshot.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-4097\" src=\"https:\/\/cbrell.de\/blog\/wp-content\/uploads\/2024\/01\/liniengrafikDotNet-screenshot.png\" alt=\"Screenshot einer SVG-Infografik im Browser Chrome\" width=\"1024\" height=\"622\" srcset=\"https:\/\/cbrell.de\/blog\/wp-content\/uploads\/2024\/01\/liniengrafikDotNet-screenshot.png 1024w, https:\/\/cbrell.de\/blog\/wp-content\/uploads\/2024\/01\/liniengrafikDotNet-screenshot-300x182.png 300w, https:\/\/cbrell.de\/blog\/wp-content\/uploads\/2024\/01\/liniengrafikDotNet-screenshot-768x467.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p>Abb. 1: Die von den Programmen erzeugte SVG-Grafik, hier als Screenshot im Browse Chrome. Dargestellt sind in der x-Achse die Zeit beginnend mit vorgestern Null Uhr bis jetzt, in schwarz die von der WLAN-Steckdose gemessene Leistung, in rot die kumulierte Leistung sprich Energie. Sowohl Leistung als auch Energie sind in der y-Achse so skaliert, dass sie die Zeichenfl\u00e4che ausf\u00fcllen.<\/p>\n<h2>Vorgehen und Programmierung<\/h2>\n<h3>Python mit Thonny<\/h3>\n<p>F\u00fcr die Programmierung des Python-Programms diente die einfache IDE Thonny. Thonny bringt schon die aktuelle Python-Version mit und ist mit einem Mausklick zu installieren.<\/p>\n<h3>C# mit Visual Studio Code<\/h3>\n<p>F\u00fcr die Programmierung in C# wurde Dot Net in der aktuellen Version (hei\u00dft: ist in einem Jahr hoffnungslos veraltet) und Visual Studio Code verwendet. Zun\u00e4chst wurde im Terminal ein Hello-World-Programm erzeugt mit &#8222;dotnet new console&#8220;, dann der Python Quelltext im Edotor einf\u00fcgt und manuell in C# \u00fcbersetzt. Da Python nicht typisiert ist, f\u00fchrt das zu einigen umst\u00e4ndlichen Konstrukten. Um die Vergleichbarkeit zu erhalten, wurden auch in C# Listen und keine starren Arrays verwendet.<\/p>\n<p>In der aktuellen Visual Studio Code Version gen\u00fcgt es, lediglich f\u00fcr den WebClient &#8222;using System.Net&#8220; einzubinden.<\/p>\n<h3>Quelltexte:<\/h3>\n<h4>Python<\/h4>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n#!\/usr\/bin\/env python3\r\n# -------------------------------\r\n# SVG-Liniengrafik\r\n# Datenvisualisierung mit Python\r\n# Claus Brell\r\n# 06.01.2024\r\n# -------------------------------\r\n# Ablauf:\r\n#   Stage 1: Daten laden von Internetquelle\r\n#   Stage 2: Daten umformen \/ anpassen\r\n#   Stage 3: SVG-Grafik erzeugen\r\n# -------------------------------\r\n# Vorbereitungen\r\n# -------------------------------\r\n# Import f\u00fcr Internet-Zugriff\r\nimport requests\r\nimport sys\r\n# initialisieren, sonst kann man nichts anh\u00e4ngen\r\n# f\u00fcr die x-Achse\r\nlisteZeit=&#x5B;]\r\nlisteZeitstempel=&#x5B;]\r\n# f\u00fcr die y-Achse\r\nlisteLeistung=&#x5B;]\r\nlisteEnergie=&#x5B;]\r\n# --------------------------------\r\n# SVG-Rohling festlegen\r\n# --------------------------------\r\n# polyLineErsatz wird die transformierten Daten aufnehmen\r\npolyLineErsatz1=&#039;&#039;\r\npolyLineErsatz2=&#039;&#039;\r\n# mehrzeiliger String mit &quot;&quot;&quot;\r\nsvgRahmen=&quot;&quot;&quot;&lt;svg width=&quot;800&quot; height=&quot;400&quot; viewBox=&quot;0 0 800 400&quot; xmlns=&quot;http:\/\/www.w3.org\/2000\/svg&quot;&gt;\r\n&lt;desc&gt;Liniengrafik mit Daten aus 2024&lt;\/desc&gt;\r\n&lt;!-- x und y Achse           --&gt;\r\n&lt;line x1=&quot;50&quot; y1=&quot;350&quot; x2=&quot;750&quot; y2=&quot;350&quot; stroke=&quot;#0a0a0a&quot; stroke-width=&quot;2&quot; \/&gt;\r\n&lt;line x1=&quot;50&quot; y1=&quot;350&quot; x2=&quot;50&quot; y2=&quot;50&quot; stroke=&quot;#0a0a0a&quot; stroke-width=&quot;2&quot; \/&gt;\r\n&lt;!-- Beschriftung --&gt;\r\n&lt;!-- maximale Leistung --&gt;\r\n&lt;text x=&quot;50&quot; y=&quot;40&quot; fill=&quot;#000000&quot; font-size=&quot;16&quot; text-anchor=&quot;middle&quot;&gt;#*3*#W&lt;\/text&gt;\r\n&lt;!-- maximale Energie --&gt;\r\n&lt;text x=&quot;#*4*#&quot; y=&quot;40&quot; fill=&quot;#ff0000&quot; font-size=&quot;16&quot; text-anchor=&quot;right&quot;&gt;#*5*#kWh&lt;\/text&gt;\r\n&lt;!-- Startzeitpunkt --&gt;\r\n&lt;text x=&quot;50&quot; y=&quot;370&quot; fill=&quot;#000000&quot; font-size=&quot;16&quot; text-anchor=&quot;left&quot;&gt;#*6*#&lt;\/text&gt;\r\n&lt;!-- Endezeitpunkt --&gt;\r\n&lt;text x=&quot;#*4*#&quot; y=&quot;370&quot; fill=&quot;#000000&quot; font-size=&quot;16&quot; text-anchor=&quot;right&quot;&gt;#*7*#&lt;\/text&gt;\r\n&lt;!-- Polygonzug zeichnen     --&gt;\r\n&lt;!-- f\u00fcr Leistung            --&gt;\r\n&lt;polyline points=&quot;#*1*#&quot; fill=&quot;none&quot; stroke=&quot;black&quot;\/&gt;\r\n&lt;!-- f\u00fcr Energie             --&gt;\r\n&lt;polyline points=&quot;#*2*#&quot; fill=&quot;none&quot; stroke=&quot;red&quot;\/&gt;\r\n&lt;\/svg&gt;\r\n&quot;&quot;&quot;\r\n# ---------------------------------------\r\n# Stage 1 Daten laden von Internetquelle\r\n# (Daten Speichern wird hier aus didaktischen Gr\u00fcnden unerschlagen)\r\n# ---------------------------------------\r\nprint(&#039;Stage 1 Daten von Internet-Quelle laden&#039;) # Nutzerbegl\u00fcckung\r\nprint()\r\n\r\nurl=&#039;https:\/\/clabremo.de\/shelly\/WS\/getshellycsvWS.php?shellyNr=192.168.1.81&#039;\r\nprint(&quot;Aufruf :&quot;, url)                           # Nutzerbegl\u00fcckung \r\nresponse = requests.get(url)\r\nprint(&quot;--&gt; &quot;,response)                      # Nutzerbegl\u00fcckung\r\n# -----------------------------------\r\n# Daten in Listen\r\n# -----------------------------------\r\n# R\u00fcckgabeobjekt enth\u00e4lt den Inhalt der Internet-Ressource\r\n# Daraus eine Liste von Zeilen erzeugen\r\ndatenstring=response.text\r\nzeilen=datenstring.split(&quot;\\r\\n&quot;)\r\nanzahlZeilen=len(zeilen)\r\nprint(&quot;Anzahl Zeilen: &quot;,anzahlZeilen) # Nutzerbegl\u00fcckung\r\n# Jede Zeile in Datenfelder zerlegen und in separate Listen packen\r\n# Start mit 1, da in Zeile 0 die Spaltenbezeichnungen stehen\r\nzeileNr=1 \r\n# Leider hat Python kein sch\u00f6nes for-Konzept, also while-Schleife verwenden\r\nwhile zeileNr&lt;(anzahlZeilen-1):\r\n    werte=zeilen&#x5B;zeileNr].split(&#039;;&#039;)\r\n    # WARTUNG print(werte)\r\n    # ACHTUNG: werte sind Strings, damit kann man nicht rechnen ...\r\n    # also: in Ganzzahlen konvertieren mit int()\r\n    listeZeitstempel.append(int(werte&#x5B;2]))\r\n    listeZeit.append(werte&#x5B;3])       # Zeit lesbar, als String belassen\r\n    listeLeistung.append(float(werte&#x5B;4]))   \r\n    listeEnergie.append(float(werte&#x5B;5]))\r\n    zeileNr=zeileNr+1\r\n# Nutzerbegl\u00fcckung: Einen Teil der Listen ausgeben\r\nprint(&#039;Ergebnis-Listen (Auszug)&#039;)\r\nprint(&#039;..............................&#039;)\r\nprint(&#039;Nr \\t Zeit \\t Leistung \\t Energie&#039;)\r\nzeileNr=0\r\nwhile zeileNr&lt;anzahlZeilen and zeileNr&lt;10:\r\n    print(zeileNr, &#039;\\t&#039;, listeZeit&#x5B;zeileNr], &#039;\\t&#039;, listeLeistung&#x5B;zeileNr], &#039;\\t&#039;, listeEnergie&#x5B;zeileNr])\r\n    zeileNr=zeileNr+1\r\nzeileNr=anzahlZeilen-10\r\nprint(&#039;..............................&#039;)\r\nwhile zeileNr&lt;(anzahlZeilen-2):\r\n    print(zeileNr, &#039;\\t&#039;, listeZeit&#x5B;zeileNr], &#039;\\t&#039;, listeLeistung&#x5B;zeileNr], &#039;\\t&#039;, listeEnergie&#x5B;zeileNr])\r\n    zeileNr=zeileNr+1\r\nprint (&quot;Daten in Listen umkopiert.&quot;)\r\n\r\n# ------------------------\r\n# Stage 2 Daten umformen \/ anpassen\r\n# ------------------------\r\n# Es folgt ein mehrfach verketteter Dreisatz, um die Daten an den viewBox des SVG anzupassen\r\n# viewBox=&quot;0 0 800 400&quot;\r\n# maximaler y-Wert: 50\r\n# minimaler y-Wert: 400-50\r\n# minimaler x-Wert: 50\r\n# maximaler x-Wert: 800-50\r\nyMin=50\r\nyMax=350\r\nyDelta=yMax-yMin\r\nxMin=50\r\nxMax=750\r\nxDelta=xMax-xMin\r\n# Aufbereiten der Daten, x-Werte m\u00fcssen nur einmal umgerechnet werden\r\nxZeitstempel=&#x5B;]\r\nyLeistung=&#x5B;]\r\nyEnergie=&#x5B;]\r\n# ein paar Hilfsdaten\r\nmaxZeitstempel=max(listeZeitstempel)\r\nminZeitstempel=min(listeZeitstempel)\r\ndeltaZeitstempel=3*24*60*60 # drei Tage\r\nmaxLeistung=max(listeLeistung)\r\nmaxEnergie=max(listeEnergie)\r\nprint(&#039;maximale Leistung: &#039;,maxLeistung,&#039; Engergie geerntet: &#039;,maxEnergie) # Nutzerbegl\u00fcckung\r\n\r\n# ------------------------------------------\r\n# Die folgenden Zeilen enthalten die eigentliche\r\n# &quot;Magie&quot; des Programms ...\r\n# ------------------------------------------\r\nzeileNr=1 \r\nwhile zeileNr&lt;(anzahlZeilen-2):\r\n    xZeitstempel.append(xMin+int(round((listeZeitstempel&#x5B;zeileNr]-minZeitstempel)\/deltaZeitstempel*xDelta)))\r\n    yLeistung.append(yMax-int(round(listeLeistung&#x5B;zeileNr]\/maxLeistung*yDelta)))\r\n    yEnergie.append(yMax-int(round(listeEnergie&#x5B;zeileNr]\/maxEnergie*yDelta)))\r\n    zeileNr=zeileNr+1\r\n# Nutzerbegl\u00fcckung: Einen Teil der Listen ausgeben\r\nprint(&#039;Daten-Umformung (Auszug)&#039;)\r\nprint(&#039;..............................&#039;)\r\nprint(&#039;Nr \\t Zeit \\t Leistung \\t Energie&#039;)\r\nzeileNr=0\r\nwhile zeileNr&lt;anzahlZeilen and zeileNr&lt;10:\r\n    print(zeileNr, &#039;\\t&#039;, xZeitstempel&#x5B;zeileNr], &#039;\\t&#039;, yLeistung&#x5B;zeileNr], &#039;\\t&#039;, yEnergie&#x5B;zeileNr])\r\n    zeileNr=zeileNr+1\r\nzeileNr=anzahlZeilen-10\r\nprint(&#039;..............................&#039;)\r\nwhile zeileNr&lt;(anzahlZeilen-3):\r\n    print(zeileNr, &#039;\\t&#039;, xZeitstempel&#x5B;zeileNr], &#039;\\t&#039;, yLeistung&#x5B;zeileNr], &#039;\\t&#039;, yEnergie&#x5B;zeileNr])\r\n    zeileNr=zeileNr+1\r\nprint (&quot;Daten an SVG angepasst.&quot;)\r\n\r\n# ------------------------\r\n# Stage 3 svg modifizieren\r\n# ------------------------\r\n# f\u00fcr jeden Wert einen Punkt erzeugen\r\nfor i in range(1,anzahlZeilen-3):\r\n    x_str=str(xZeitstempel&#x5B;i])\r\n    yL_str=str(yLeistung&#x5B;i])\r\n    yE_str=str(yEnergie&#x5B;i])\r\n    polyLineErsatz1+=x_str+&quot;,&quot;+yL_str+&quot; \\r\\n&quot;\r\n    polyLineErsatz2+=x_str+&quot;,&quot;+yE_str+&quot; \\r\\n&quot;\r\n    # Nutzerbegl\u00fcckung sys.stdout.write(&#039;.&#039;)\r\nprint ()\r\n# Kontrolle\r\n# print (&quot;polyline-Ersatz&quot;)\r\n# print (&quot;---------------&quot;)\r\n# print (polyLineErsatz1)\r\n# print (polyLineErsatz2)\r\n# letzter Schritt: Platzhalter in svg ersetzen\r\nsvgOut=svgRahmen.replace(&quot;#*1*#&quot;,polyLineErsatz1)\r\nsvgOut=svgOut.replace(&quot;#*2*#&quot;,polyLineErsatz2)\r\nsvgOut=svgOut.replace(&quot;#*3*#&quot;,str(maxLeistung))\r\nsvgOut=svgOut.replace(&quot;#*4*#&quot;,str(max(xZeitstempel)))\r\nsvgOut=svgOut.replace(&quot;#*5*#&quot;,str(listeEnergie&#x5B;anzahlZeilen-3]))\r\nsvgOut=svgOut.replace(&quot;#*6*#&quot;,listeZeit&#x5B;1])\r\nsvgOut=svgOut.replace(&quot;#*7*#&quot;,listeZeit&#x5B;anzahlZeilen-3])\r\n\r\n# speichern\r\n# Datei \u00f6ffnen, String hineinschreiben, schlie\u00dfen\r\ndatei = open(&#039;liniengrafik.svg&#039;,&#039;w&#039;)\r\ndatei.write(svgOut)\r\ndatei.close()\r\nprint (&quot;Daten in linengrafik.svg gespeichert&quot;)\r\nprint (&quot;----- fertig -----&quot;)\r\n<\/pre>\n<p>Listing 1: Python Quelltext<\/p>\n<h4>C#<\/h4>\n<p>&nbsp;<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n\/\/ Noch aus der Python-Datei: #!\/usr\/bin\/env python3\r\n\/\/ -------------------------------\r\n\/\/ SVG-Liniengrafik\r\n\/\/ Datenvisualisierung mit Python &gt;&gt;&gt; Umsetzung in C# \/ Dot Net\r\n\/\/ Claus Brell\r\n\/\/ 06.01.2024 &gt;&gt;&gt; 08.01.2024\r\n\/\/ -------------------------------\r\n\/\/ Ablauf:\r\n\/\/   Stage 1: Daten laden von Internetquelle\r\n\/\/   Stage 2: Daten umformen \/ anpassen\r\n\/\/   Stage 3: SVG-Grafik erzeugen\r\n\/\/ -------------------------------\r\n\/\/ Vorbereitungen\r\n\/\/ -------------------------------\r\n\/\/ using System;    \/\/funktioniert auch so\r\n\/\/ using System.IO; \/\/funktioniert auch so\r\nusing System.Net; \/\/ entspricht Import f\u00fcr Internet-Zugriff\r\n\/\/ Das Folgende braucht man in Python nicht ...\r\n\/\/ ACHTUNG: Keinen expliziten namespace verwenden\r\n\r\nclass Program {\r\n static void Main(string&#x5B;] args) {\r\n\r\n\/\/ initialisieren, sonst kann man nichts anh\u00e4ngen\r\n\/\/ f\u00fcr die x-Achse\r\n\/\/ so gehts: List&lt;double&gt; wertedummy =new List&lt;double&gt;() {1,2,3,4,5,6}; \/\/ vorbelegen\r\nList&lt;string&gt; listeZeit=new List&lt;string&gt;();\r\nList&lt;int&gt; listeZeitstempel=new List&lt;int&gt;();\r\n\/\/ f\u00fcr die y-Achse\r\nList&lt;double&gt; listeLeistung=new List&lt;double&gt;();\r\nList&lt;double&gt; listeEnergie=new List&lt;double&gt;();\r\n\/\/ --------------------------------\r\n\/\/ SVG-Rohling festlegen\r\n\/\/ --------------------------------\r\n\/\/ polyLineErsatz wird die transformierten Daten aufnehmen\r\nstring polyLineErsatz1=&quot;&quot;;\r\nstring polyLineErsatz2=&quot;&quot;;\r\n\/\/ mehrzeiliger String mit (&quot;&quot;&quot; in Python), in Dot Net kein Problem\r\nstring svgRahmen=@&quot;&lt;svg width=&quot;&quot;800&quot;&quot; height=&quot;&quot;400&quot;&quot; viewBox=&quot;&quot;0 0 800 400&quot;&quot;\r\nxmlns=&quot;&quot;http:\/\/www.w3.org\/2000\/svg&quot;&quot;&gt;\r\n&lt;desc&gt;Liniengrafik mit Daten aus 2024&lt;\/desc&gt;\r\n&lt;!-- x und y Achse           --&gt;\r\n&lt;line x1=&quot;&quot;50&quot;&quot; y1=&quot;&quot;350&quot;&quot; x2=&quot;&quot;750&quot;&quot; y2=&quot;&quot;350&quot;&quot; stroke=&quot;&quot;#0a0a0a&quot;&quot; stroke-width=&quot;&quot;2&quot;&quot; \/&gt;\r\n&lt;line x1=&quot;&quot;50&quot;&quot; y1=&quot;&quot;350&quot;&quot; x2=&quot;&quot;50&quot;&quot; y2=&quot;&quot;50&quot;&quot; stroke=&quot;&quot;#0a0a0a&quot;&quot; stroke-width=&quot;&quot;2&quot;&quot; \/&gt;\r\n&lt;!-- Beschriftung --&gt;\r\n&lt;!-- maximale Leistung --&gt;\r\n&lt;text x=&quot;&quot;50&quot;&quot; y=&quot;&quot;40&quot;&quot; fill=&quot;&quot;#000000&quot;&quot; font-size=&quot;&quot;16&quot;&quot; text-anchor=&quot;&quot;middle&quot;&quot;&gt;#*3*#W&lt;\/text&gt;\r\n&lt;!-- maximale Energie --&gt;\r\n&lt;text x=&quot;&quot;#*4*#&quot;&quot; y=&quot;&quot;40&quot;&quot; fill=&quot;&quot;#ff0000&quot;&quot; font-size=&quot;&quot;16&quot;&quot; text-anchor=&quot;&quot;right&quot;&quot;&gt;#*5*#kWh&lt;\/text&gt;\r\n&lt;!-- Startzeitpunkt --&gt;\r\n&lt;text x=&quot;&quot;50&quot;&quot; y=&quot;&quot;370&quot;&quot; fill=&quot;&quot;#000000&quot;&quot; font-size=&quot;&quot;16&quot;&quot; text-anchor=&quot;&quot;left&quot;&quot;&gt;#*6*#&lt;\/text&gt;\r\n&lt;!-- Endezeitpunkt --&gt;\r\n&lt;text x=&quot;&quot;#*4*#&quot;&quot; y=&quot;&quot;370&quot;&quot; fill=&quot;&quot;#000000&quot;&quot; font-size=&quot;&quot;16&quot;&quot; text-anchor=&quot;&quot;right&quot;&quot;&gt;#*7*#&lt;\/text&gt;\r\n&lt;!-- Polygonzug zeichnen     --&gt;\r\n&lt;!-- f\u00fcr Leistung            --&gt;\r\n&lt;polyline points=&quot;&quot;#*1*#&quot;&quot; fill=&quot;&quot;none&quot;&quot; stroke=&quot;&quot;black&quot;&quot;\/&gt;\r\n&lt;!-- f\u00fcr Energie             --&gt;\r\n&lt;polyline points=&quot;&quot;#*2*#&quot;&quot; fill=&quot;&quot;none&quot;&quot; stroke=&quot;&quot;red&quot;&quot;\/&gt;\r\n&lt;\/svg&gt;\r\n&quot;;\r\n\/\/ ---------------------------------------\r\n\/\/ Stage 1 Daten laden von Internetquelle\r\n\/\/ (Daten Speichern wird hier aus didaktischen Gr\u00fcnden unterschlagen)\r\n\/\/ ---------------------------------------\r\nConsole.WriteLine(&quot;Stage 1 Daten von Internet-Quelle laden&quot;);\/\/ Nutzerbegl\u00fcckung\r\n\r\nstring url=&quot;https:\/\/clabremo.de\/shelly\/WS\/getshellycsvWS.php?shellyNr=192.168.1.81&quot;;\r\nConsole.WriteLine(&quot;Aufruf: &quot;+url);                           \/\/ Nutzerbegl\u00fcckung \r\nstring response = &quot;&quot;;\r\n\/\/Anlegen eines Webclients. Dieser \u00fcbernimmt das Herunterladen der Daten.\r\n\/\/ Lassen Sie sich durch die &quot;Veraltet-Warnung&quot; nicht verbl\u00fcffen\r\nWebClient myWebClient = new WebClient();\r\n\/\/ Datenstrom zur URL aufmachen in zwei Schritten\r\n\/\/ WARTUNG Console.WriteLine(&quot;Url: &quot;+url);\r\nStream data=myWebClient.OpenRead(url);\r\nStreamReader reader=new StreamReader(data);\r\n\/\/ Kompletten Inhalt der R\u00fcckgabe in einen String einlesen\r\nConsole.Write(&quot;Beginne Daten Einlesen ...&quot;);\r\nresponse=reader.ReadToEnd();\r\nConsole.Write(&quot;Einlesen beendet, Enter dr\u00fccken (1) ...&quot;);\r\n\/\/ WARTUNG Console.ReadLine();\r\n\/\/ Verbindung wieder schlie\u00dfen\r\nreader.Close();\r\ndata.Close();\r\nConsole.WriteLine(&quot;\\r\\nresponse: &quot;);\r\nConsole.WriteLine(response.Substring(0,512)); \r\nConsole.WriteLine(response.Substring(response.Length-512));                    \/\/ Nutzerbegl\u00fcckung\r\n\/\/ -----------------------------------\r\n\/\/ Daten in Listen\r\n\/\/ -----------------------------------\r\n\/\/ R\u00fcckgabeobjekt enth\u00e4lt den Inhalt der Internet-Ressource\r\n\/\/ Daraus eine Liste von Zeilen erzeugen\r\nstring&#x5B;] zeilen=response.Split(&quot;\\r\\n&quot;); \/\/ https:\/\/learn.microsoft.com\/de-de\/dotnet\/api\/system.string.split?view=net-8.0\r\nint anzahlZeilen=zeilen.Length;\r\nConsole.Write(&quot;Anzahl Zeilen: &quot;); \/\/ Nutzerbegl\u00fcckung\r\nConsole.WriteLine(anzahlZeilen); \/\/ Nutzerbegl\u00fcckung\r\n\/\/ Jede Zeile in Datenfelder zerlegen und in separate Listen packen\r\n\/\/ Start mit 1, da in Zeile 0 die Spaltenbezeichnungen stehen\r\nint zeileNr=1; \r\n\/\/ Leider hat Python kein sch\u00f6nes for-Konzept, also while-Schleife verwenden\r\n\/\/ Zum Vergleich hier vergleichbare Programmierung\r\nConsole.WriteLine(&quot;Umformung... Enter dr\u00fccken (2) ...&quot;);\r\n\/\/ WARTUNG Console.ReadLine();\r\nwhile (zeileNr&lt;(anzahlZeilen-1)){\r\n    \/\/ WARTUNG Console.Write(&#039;.&#039;);\r\n    string&#x5B;] werte=zeilen&#x5B;zeileNr].Split(&#039;;&#039;);\r\n    \/\/ WARTUNG print(werte)\r\n    \/\/ ACHTUNG: werte sind Strings, damit kann man nicht rechnen ...\r\n    \/\/ also: in Ganzzahlen konvertieren mit int()\r\n    listeZeitstempel.Add(Convert.ToInt32(werte&#x5B;2])); \/\/https:\/\/learn.microsoft.com\/de-de\/dotnet\/api\/system.convert.toint32?view=net-8.0\r\n    listeZeit.Add(werte&#x5B;3]);       \/\/ Zeit lesbar, als String belassen\r\n    \/\/ ACHTUNG: eingedeutschtes DOT NET verwirft Punkt als Dezmaltrenner und rechnet falsch!!!!!\r\n    listeLeistung.Add(Convert.ToDouble(werte&#x5B;4].Replace(&quot;.&quot;,&quot;,&quot;))); \/\/ Korrigiert DOT NET Unsinn  \r\n    listeEnergie.Add(Convert.ToDouble(werte&#x5B;5].Replace(&quot;.&quot;,&quot;,&quot;))); \/\/ Korrigiert DOT NET Unsinn\r\n    zeileNr++;\r\n} \/\/ Ende while\r\n\/\/ Nutzerbegl\u00fcckung: Einen Teil der Listen ausgeben\r\nConsole.WriteLine(&quot;Ergebnis-Listen (Auszug) Enter dr\u00fccken (3)&quot;);\r\n\/\/ WARTUNG Console.ReadLine();\r\nConsole.WriteLine(&quot;..............................&quot;);\r\nConsole.WriteLine(&quot;Nr \\t Zeit \\t\\t Leistung \\t Energie&quot;);\r\nzeileNr=0;\r\nwhile(zeileNr&lt;anzahlZeilen &amp; zeileNr&lt;10){\r\n    Console.Write(zeileNr);\r\n    Console.Write(&quot;\\t&quot;);\r\n    Console.Write(listeZeit&#x5B;zeileNr]);\r\n    Console.Write(&quot;\\t&quot;);\r\n    Console.Write(listeLeistung&#x5B;zeileNr]);\r\n    Console.Write(&quot;\\t&quot;);\r\n    Console.WriteLine(listeEnergie&#x5B;zeileNr]);\r\n    zeileNr++;\r\n}\r\nzeileNr=anzahlZeilen-10;\r\nConsole.WriteLine(&quot;..............................&quot;);\r\nwhile (zeileNr&lt;(anzahlZeilen-2)){\r\n    Console.Write(zeileNr);\r\n    Console.Write(&quot;\\t&quot;);\r\n    Console.Write(listeZeit&#x5B;zeileNr]);\r\n    Console.Write(&quot;\\t&quot;);\r\n    Console.Write(listeLeistung&#x5B;zeileNr]);\r\n    Console.Write(&quot;\\t&quot;);\r\n    Console.WriteLine(listeEnergie&#x5B;zeileNr]);\r\n    zeileNr++;\r\n}\r\nConsole.WriteLine(&quot;Daten in Listen umkopiert.&quot;);\r\n\r\n\/\/ ------------------------\r\n\/\/ Stage 2 Daten umformen \/ anpassen\r\n\/\/ ------------------------\r\n\/\/ Es folgt ein mehrfach verketteter Dreisatz, um die Daten an den viewBox des SVG anzupassen\r\n\/\/ viewBox=&quot;0 0 800 400&quot;\r\n\/\/ maximaler y-Wert: 50\r\n\/\/ minimaler y-Wert: 400-50\r\n\/\/ minimaler x-Wert: 50\r\n\/\/ maximaler x-Wert: 800-50\r\nint yMin=50;\r\nint yMax=350;\r\nint yDelta=yMax-yMin;\r\nint xMin=50;\r\nint xMax=750;\r\nint xDelta=xMax-xMin;\r\n\/\/ Aufbereiten der Daten, x-Werte m\u00fcssen nur einmal umgerechnet werden\r\nList&lt;int&gt; xZeitstempel=new List&lt;int&gt;();\r\nList&lt;int&gt; yLeistung=new List&lt;int&gt;();\r\nList&lt;int&gt; yEnergie=new List&lt;int&gt;();\r\n\/\/ ein paar Hilfsdaten\r\nint maxZeitstempel=listeZeitstempel.Max();\r\nint minZeitstempel=listeZeitstempel.Min();\r\nint deltaZeitstempel=3*24*60*60; \/\/ drei Tage\r\ndouble maxLeistung=listeLeistung.Max();\r\ndouble maxEnergie=listeEnergie.Max();\r\nConsole.Write(&quot;kleinster Zeitstempel: &quot;);\r\nConsole.Write(minZeitstempel); \/\/ Nutzerbegl\u00fcckung\r\nConsole.Write(&quot; gr\u00f6\u00dfter Zeitstempel: &quot;);\r\nConsole.Write(maxZeitstempel); \/\/ Nutzerbegl\u00fcckung\r\nConsole.Write(&quot; Delta: &quot;);\r\nConsole.WriteLine(deltaZeitstempel); \/\/ Nutzerbegl\u00fcckung\r\nConsole.Write(&quot;erster Zeitstempel: &quot;);\r\nConsole.Write(listeZeitstempel&#x5B;0]); \/\/ Nutzerbegl\u00fcckung\r\nConsole.Write(&quot; letzter Zeitstempel: &quot;);\r\nConsole.WriteLine(listeZeitstempel&#x5B;anzahlZeilen-3]); \/\/ Nutzerbegl\u00fcckung\r\nConsole.Write(&quot;maximale Leistung: &quot;);\r\nConsole.Write(maxLeistung); \/\/ Nutzerbegl\u00fcckung\r\nConsole.Write(&quot; Energie geerntet: &quot;); \/\/ Nutzerbegl\u00fcckung\r\nConsole.WriteLine(maxEnergie); \/\/ Nutzerbegl\u00fcckung\r\n\/\/ ------------------------------------------\r\n\/\/ Die folgenden Zeilen enthalten die eigentliche\r\n\/\/ &quot;Magie&quot; des Programms ...\r\n\/\/ ------------------------------------------\r\nzeileNr=0;\r\nwhile (zeileNr&lt;(anzahlZeilen-2)){\r\n    xZeitstempel.Add(xMin+(int)Math.Round((double)(listeZeitstempel&#x5B;zeileNr]-minZeitstempel)\/(double)deltaZeitstempel*(double)xDelta));\r\n    yLeistung.Add(yMax-(int)Math.Round((double)(listeLeistung&#x5B;zeileNr]\/maxLeistung*yDelta)));\r\n    yEnergie.Add(yMax-(int)Math.Round((double)(listeEnergie&#x5B;zeileNr]\/maxEnergie*yDelta)));\r\n    \/\/ WARTUNG Console.WriteLine(zeileNr);\r\n    \/\/ WARTUNG Console.WriteLine(xZeitstempel&#x5B;zeileNr]);\r\n    zeileNr++;\r\n    \r\n}\r\n\/\/ Nutzerbegl\u00fcckung: Einen Teil der Listen ausgeben\r\nConsole.WriteLine(&quot;\\r\\nDaten-Umformung (Auszug)&quot;);\r\nConsole.WriteLine(&quot;..............................&quot;);\r\nConsole.WriteLine(&quot;Nr \\t Zeit \\t Leistung \\t Energie&quot;);\r\nzeileNr=0;\r\nwhile (zeileNr&lt;anzahlZeilen &amp; zeileNr&lt;10){\r\n    Console.Write(zeileNr);\r\n    Console.Write(&#039;\\t&#039;);\r\n    Console.Write(xZeitstempel&#x5B;zeileNr]);\r\n    Console.Write(&#039;\\t&#039;);\r\n    Console.Write(yLeistung&#x5B;zeileNr]);\r\n    Console.Write(&#039;\\t&#039;);\r\n    Console.WriteLine(yEnergie&#x5B;zeileNr]);\r\n    zeileNr++;\r\n}\r\nzeileNr=anzahlZeilen-10;\r\nConsole.WriteLine(&quot;..............................&quot;);\r\nwhile (zeileNr&lt;(anzahlZeilen-3)){\r\n    Console.Write(zeileNr);\r\n    Console.Write(&#039;\\t&#039;);\r\n    Console.Write(xZeitstempel&#x5B;zeileNr]);\r\n    Console.Write(&#039;\\t&#039;);\r\n    Console.Write(yLeistung&#x5B;zeileNr]);\r\n    Console.Write(&#039;\\t&#039;);\r\n    Console.WriteLine(yEnergie&#x5B;zeileNr]);    \r\n    zeileNr++;\r\n}\r\nConsole.WriteLine(&quot;Daten an SVG angepasst.&quot;);\r\n\r\n\/\/ ------------------------\r\n\/\/ Stage 3 svg modifizieren\r\n\/\/ ------------------------\r\n\/\/ f\u00fcr jeden Wert einen Punkt erzeugen\r\nstring x_str, yL_str, yE_str;\r\nfor (int i=1;i&lt;(anzahlZeilen-3);i++){\r\n    x_str=xZeitstempel&#x5B;i].ToString();\r\n    yL_str=yLeistung&#x5B;i].ToString();\r\n    yE_str=yEnergie&#x5B;i].ToString();\r\n    polyLineErsatz1+=x_str+&quot;,&quot;+yL_str+&quot; \\r\\n&quot;;\r\n    polyLineErsatz2+=x_str+&quot;,&quot;+yE_str+&quot; \\r\\n&quot;;\r\n    \/\/ Nutzerbegl\u00fcckung sys.stdout.write(&#039;.&#039;)\r\n}\r\n\r\n\/\/ Kontrolle (noch Zeilen aus Python Programm)\r\n\/\/ print (&quot;polyline-Ersatz&quot;)\r\n\/\/ print (&quot;---------------&quot;)\r\n\/\/ print (polyLineErsatz1)\r\n\/\/ print (polyLineErsatz2)\r\n\/\/ letzter Schritt: Platzhalter in svg ersetzen\r\nstring svgOut=svgRahmen.Replace(&quot;#*1*#&quot;,polyLineErsatz1);\r\nsvgOut=svgOut.Replace(&quot;#*2*#&quot;,polyLineErsatz2);\r\nsvgOut=svgOut.Replace(&quot;#*3*#&quot;,maxLeistung.ToString());\r\nsvgOut=svgOut.Replace(&quot;#*4*#&quot;,Convert.ToString(xZeitstempel.Max()-75)); \/\/ etwas nach links verschieben\r\nsvgOut=svgOut.Replace(&quot;#*5*#&quot;,Convert.ToString(listeEnergie&#x5B;anzahlZeilen-3]));\r\nsvgOut=svgOut.Replace(&quot;#*6*#&quot;,listeZeit&#x5B;1]);\r\nsvgOut=svgOut.Replace(&quot;#*7*#&quot;,listeZeit&#x5B;anzahlZeilen-3]);\r\n\/\/ speichern\r\n\/\/ Datei \u00f6ffnen, String hineinschreiben, schlie\u00dfen\r\n\/\/ Das geht in C# einfacher als in Python\r\nFile.WriteAllText(&quot;liniengrafikDotNet.svg&quot;, svgOut); \r\nConsole.WriteLine(&quot;Daten in liniengrafikDotNet.svg gespeichert&quot;);\r\nConsole.WriteLine(&quot;----- fertig -----&quot;);\r\n\r\n } \/\/ Ende main\r\n}\/\/ Ende class\r\n\/\/ Achtung: kein Ende namespace\r\n<\/pre>\n<p>Listing 3: C# Quelltext<\/p>\n<p>&nbsp;<\/p>\n<h2>Anhang<\/h2>\n<h3>Quellen<\/h3>\n<p><a href=\"https:\/\/cbrell.de\/blog\/svg-grafiken-erzeugen-mit-chatgpt\/\">SVG Grafiken erzeugen mit chatGPT<\/a><\/p>\n<p>SVG Tutorials<\/p>\n<p>\u00dcbersicht von Tutorials auf selfhtml: <a href=\"https:\/\/wiki.selfhtml.org\/wiki\/SVG\/Tutorials\">https:\/\/wiki.selfhtml.org\/wiki\/SVG\/Tutorials<\/a><\/p>\n<p>Ein HTML-Seminar, das SVG beleuchtet: <a href=\"https:\/\/www.html-seminar.de\/svg-in-websites-nutzen.htm\">https:\/\/www.html-seminar.de\/svg-in-websites-nutzen.htm<\/a><\/p>\n<h3>Glossar<\/h3>\n<h4>ETL-Prozess<\/h4>\n<p>Extract, Transform, Load (ETL) ist ein Prozess, bei dem Daten aus mehreren, oft unterschiedlich oder auch gar nicht strukturierten Datenquellen geladen, umgeformt und dann in einer Zieldatenbank &#8211; das kann auch eine einfache Datei sein &#8211; zusammengef\u00fchrt werden. Eingesetzt werden ETL-Prozesse z.B. beim data-warehousing. Mittels ETL zusammengef\u00fchrte Daten werde oft visualisiert, um sie einer schnellen Beurteilung zug\u00e4nglich zu machen.<\/p>\n<h3>Autor und Lizenz<\/h3>\n<p><strong>Autor:<\/strong>\u00a0Prof. Dr. rer. nat. Claus Brell, aktuelle Projekte:\u00a0<a href=\"http:\/\/bieneviernull.de\/\">Biene40<\/a>,\u00a0<a href=\"https:\/\/ai4bee.de\/\">AI4Bee<\/a><br \/>\n<strong>Lizenz:<\/strong>\u00a0CC BY<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/licensebuttons.net\/l\/by\/3.0\/88x31.png\" \/><\/p>\n<p>Inhalte des Beitrages k\u00f6nnen Sie entsprechen der Lizenz verwenden. Unter dieser Lizenz ver\u00f6ffentlichte Werke darf jedermann f\u00fcr private, gewerbliche und sonstige Zwecke nutzen ver\u00e4ndern und auch neu ohne CC-Lizenz vermarkten. Als Urheber mache ich keine Rechte geltend.<\/p>\n<p>&nbsp;<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cbrell.de\/zaehler?x=1838\" \/><\/p>\n<p>&nbsp;<\/p>\n<div class=\"shariff shariff-align-flex-start shariff-widget-align-flex-start\" data-services=\"facebook\" data-url=\"https%3A%2F%2Fcbrell.de%2Fblog%2Fsvg-diagramm-erzeugen-mit-python-und-c-im-vergleich%2F\" data-timestamp=\"1704833650\" data-backendurl=\"https:\/\/cbrell.de\/blog\/wp-json\/shariff\/v1\/share_counts?\"><div class=\"ShariffHeadline\">Teile diesen Beitrag.<\/div><ul class=\"shariff-buttons theme-round orientation-horizontal buttonsize-medium\"><li class=\"shariff-button twitter shariff-nocustomcolor\" style=\"background-color:#32bbf5\"><a href=\"https:\/\/twitter.com\/share?url=https%3A%2F%2Fcbrell.de%2Fblog%2Fsvg-diagramm-erzeugen-mit-python-und-c-im-vergleich%2F&text=SVG%20Diagramm%20erzeugen%20mit%20Python%20und%20C%23%20im%20Vergleich\" title=\"Bei Twitter teilen\" aria-label=\"Bei Twitter teilen\" role=\"button\" rel=\"noopener nofollow\" class=\"shariff-link\" style=\"; background-color:#55acee; color:#fff\" target=\"_blank\"><span class=\"shariff-icon\" style=\"\"><svg width=\"32px\" height=\"20px\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 30 32\"><path fill=\"#55acee\" d=\"M29.7 6.8q-1.2 1.8-3 3.1 0 0.3 0 0.8 0 2.5-0.7 4.9t-2.2 4.7-3.5 4-4.9 2.8-6.1 1q-5.1 0-9.3-2.7 0.6 0.1 1.5 0.1 4.3 0 7.6-2.6-2-0.1-3.5-1.2t-2.2-3q0.6 0.1 1.1 0.1 0.8 0 1.6-0.2-2.1-0.4-3.5-2.1t-1.4-3.9v-0.1q1.3 0.7 2.8 0.8-1.2-0.8-2-2.2t-0.7-2.9q0-1.7 0.8-3.1 2.3 2.8 5.5 4.5t7 1.9q-0.2-0.7-0.2-1.4 0-2.5 1.8-4.3t4.3-1.8q2.7 0 4.5 1.9 2.1-0.4 3.9-1.5-0.7 2.2-2.7 3.4 1.8-0.2 3.5-0.9z\"\/><\/svg><\/span><\/a><\/li><li class=\"shariff-button facebook shariff-nocustomcolor\" style=\"background-color:#4273c8\"><a href=\"https:\/\/www.facebook.com\/sharer\/sharer.php?u=https%3A%2F%2Fcbrell.de%2Fblog%2Fsvg-diagramm-erzeugen-mit-python-und-c-im-vergleich%2F\" title=\"Bei Facebook teilen\" aria-label=\"Bei Facebook teilen\" role=\"button\" rel=\"nofollow\" class=\"shariff-link\" style=\"; background-color:#3b5998; color:#fff\" target=\"_blank\"><span class=\"shariff-icon\" style=\"\"><svg width=\"32px\" height=\"20px\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 18 32\"><path fill=\"#3b5998\" d=\"M17.1 0.2v4.7h-2.8q-1.5 0-2.1 0.6t-0.5 1.9v3.4h5.2l-0.7 5.3h-4.5v13.6h-5.5v-13.6h-4.5v-5.3h4.5v-3.9q0-3.3 1.9-5.2t5-1.8q2.6 0 4.1 0.2z\"\/><\/svg><\/span><\/a><\/li><li class=\"shariff-button linkedin shariff-nocustomcolor\" style=\"background-color:#1488bf\"><a href=\"https:\/\/www.linkedin.com\/sharing\/share-offsite\/?url=https%3A%2F%2Fcbrell.de%2Fblog%2Fsvg-diagramm-erzeugen-mit-python-und-c-im-vergleich%2F\" title=\"Bei LinkedIn teilen\" aria-label=\"Bei LinkedIn teilen\" role=\"button\" rel=\"noopener nofollow\" class=\"shariff-link\" style=\"; background-color:#0077b5; color:#fff\" target=\"_blank\"><span class=\"shariff-icon\" style=\"\"><svg width=\"32px\" height=\"20px\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 27 32\"><path fill=\"#0077b5\" d=\"M6.2 11.2v17.7h-5.9v-17.7h5.9zM6.6 5.7q0 1.3-0.9 2.2t-2.4 0.9h0q-1.5 0-2.4-0.9t-0.9-2.2 0.9-2.2 2.4-0.9 2.4 0.9 0.9 2.2zM27.4 18.7v10.1h-5.9v-9.5q0-1.9-0.7-2.9t-2.3-1.1q-1.1 0-1.9 0.6t-1.2 1.5q-0.2 0.5-0.2 1.4v9.9h-5.9q0-7.1 0-11.6t0-5.3l0-0.9h5.9v2.6h0q0.4-0.6 0.7-1t1-0.9 1.6-0.8 2-0.3q3 0 4.9 2t1.9 6z\"\/><\/svg><\/span><\/a><\/li><\/ul><\/div>","protected":false},"excerpt":{"rendered":"<p>Gerade im IoT-Umfeld nehmen die Datenmengen gerne schwindelerregende Umf\u00e4nge an. Die einzige Chance, den \u00dcberblick zu behalten, ist eine geeignete Datenvisualisierung. Der erste Schritt bei Zeitreihendaten ist die Erstellung einer &#8230;<\/p>\n","protected":false},"author":1,"featured_media":4113,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[718,1015,173,74,110,1012],"class_list":["post-4093","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-allgemein","tag-c","tag-csharp","tag-datenvisualisierung","tag-programmierung","tag-python","tag-svg"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>SVG Diagramm erzeugen mit Python und C# im Vergleich - Bienen, Natur und Internet of Things<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cbrell.de\/blog\/svg-diagramm-erzeugen-mit-python-und-c-im-vergleich\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SVG Diagramm erzeugen mit Python und C# im Vergleich - Bienen, Natur und Internet of Things\" \/>\n<meta property=\"og:description\" content=\"Gerade im IoT-Umfeld nehmen die Datenmengen gerne schwindelerregende Umf\u00e4nge an. Die einzige Chance, den \u00dcberblick zu behalten, ist eine geeignete Datenvisualisierung. Der erste Schritt bei Zeitreihendaten ist die Erstellung einer ...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cbrell.de\/blog\/svg-diagramm-erzeugen-mit-python-und-c-im-vergleich\/\" \/>\n<meta property=\"og:site_name\" content=\"Bienen, Natur und Internet of Things\" \/>\n<meta property=\"article:published_time\" content=\"2024-01-09T19:28:41+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-01-09T19:54:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cbrell.de\/blog\/wp-content\/uploads\/2024\/01\/python-csharp-svg-logokette-by-claus-brell.png\" \/>\n\t<meta property=\"og:image:width\" content=\"840\" \/>\n\t<meta property=\"og:image:height\" content=\"270\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Claus Brell\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@clausbrell5859\" \/>\n<meta name=\"twitter:site\" content=\"@clausbrell\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Claus Brell\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"4\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/cbrell.de\\\/blog\\\/svg-diagramm-erzeugen-mit-python-und-c-im-vergleich\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/cbrell.de\\\/blog\\\/svg-diagramm-erzeugen-mit-python-und-c-im-vergleich\\\/\"},\"author\":{\"name\":\"Claus Brell\",\"@id\":\"https:\\\/\\\/cbrell.de\\\/blog\\\/#\\\/schema\\\/person\\\/7cf529e46faf1fd7b2b6942fec254c58\"},\"headline\":\"SVG Diagramm erzeugen mit Python und C# im Vergleich\",\"datePublished\":\"2024-01-09T19:28:41+00:00\",\"dateModified\":\"2024-01-09T19:54:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/cbrell.de\\\/blog\\\/svg-diagramm-erzeugen-mit-python-und-c-im-vergleich\\\/\"},\"wordCount\":3096,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/cbrell.de\\\/blog\\\/svg-diagramm-erzeugen-mit-python-und-c-im-vergleich\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/cbrell.de\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/01\\\/python-csharp-svg-logokette-by-claus-brell.png\",\"keywords\":[\"C\",\"csharp\",\"Datenvisualisierung\",\"Programmierung\",\"Python\",\"SVG\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/cbrell.de\\\/blog\\\/svg-diagramm-erzeugen-mit-python-und-c-im-vergleich\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/cbrell.de\\\/blog\\\/svg-diagramm-erzeugen-mit-python-und-c-im-vergleich\\\/\",\"url\":\"https:\\\/\\\/cbrell.de\\\/blog\\\/svg-diagramm-erzeugen-mit-python-und-c-im-vergleich\\\/\",\"name\":\"SVG Diagramm erzeugen mit Python und C# im Vergleich - Bienen, Natur und Internet of Things\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/cbrell.de\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/cbrell.de\\\/blog\\\/svg-diagramm-erzeugen-mit-python-und-c-im-vergleich\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/cbrell.de\\\/blog\\\/svg-diagramm-erzeugen-mit-python-und-c-im-vergleich\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/cbrell.de\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/01\\\/python-csharp-svg-logokette-by-claus-brell.png\",\"datePublished\":\"2024-01-09T19:28:41+00:00\",\"dateModified\":\"2024-01-09T19:54:10+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/cbrell.de\\\/blog\\\/#\\\/schema\\\/person\\\/7cf529e46faf1fd7b2b6942fec254c58\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/cbrell.de\\\/blog\\\/svg-diagramm-erzeugen-mit-python-und-c-im-vergleich\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/cbrell.de\\\/blog\\\/svg-diagramm-erzeugen-mit-python-und-c-im-vergleich\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/cbrell.de\\\/blog\\\/svg-diagramm-erzeugen-mit-python-und-c-im-vergleich\\\/#primaryimage\",\"url\":\"https:\\\/\\\/cbrell.de\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/01\\\/python-csharp-svg-logokette-by-claus-brell.png\",\"contentUrl\":\"https:\\\/\\\/cbrell.de\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/01\\\/python-csharp-svg-logokette-by-claus-brell.png\",\"width\":840,\"height\":270},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/cbrell.de\\\/blog\\\/svg-diagramm-erzeugen-mit-python-und-c-im-vergleich\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\\\/\\\/cbrell.de\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SVG Diagramm erzeugen mit Python und C# im Vergleich\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/cbrell.de\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/cbrell.de\\\/blog\\\/\",\"name\":\"Bienen, Natur und Internet of Things\",\"description\":\"Alles, was einfach ist. Von Claus Brell\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/cbrell.de\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/cbrell.de\\\/blog\\\/#\\\/schema\\\/person\\\/7cf529e46faf1fd7b2b6942fec254c58\",\"name\":\"Claus Brell\",\"description\":\"Seit 2021 forsche ich an und mit Bienen (Digitalisierung der Imkerei) Seit 2012 Professur f\u00fcr Wirtschaftsinformatik an der Hochschue Niederrhein. Seit 1981 treibt mich die Frage um: Was haben Physik, Heavy Metal und Spiele miteinander zu tun? Drei m\u00f6gliche Antworten: {nichts | 42 | gleiche Hirnareale werden aktiviert}\",\"sameAs\":[\"http:\\\/\\\/claus-brell.de\",\"https:\\\/\\\/x.com\\\/clausbrell5859\",\"https:\\\/\\\/www.youtube.com\\\/@clausbrell5859\"],\"url\":\"https:\\\/\\\/cbrell.de\\\/blog\\\/author\\\/clausb\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"SVG Diagramm erzeugen mit Python und C# im Vergleich - Bienen, Natur und Internet of Things","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cbrell.de\/blog\/svg-diagramm-erzeugen-mit-python-und-c-im-vergleich\/","og_locale":"de_DE","og_type":"article","og_title":"SVG Diagramm erzeugen mit Python und C# im Vergleich - Bienen, Natur und Internet of Things","og_description":"Gerade im IoT-Umfeld nehmen die Datenmengen gerne schwindelerregende Umf\u00e4nge an. Die einzige Chance, den \u00dcberblick zu behalten, ist eine geeignete Datenvisualisierung. Der erste Schritt bei Zeitreihendaten ist die Erstellung einer ...","og_url":"https:\/\/cbrell.de\/blog\/svg-diagramm-erzeugen-mit-python-und-c-im-vergleich\/","og_site_name":"Bienen, Natur und Internet of Things","article_published_time":"2024-01-09T19:28:41+00:00","article_modified_time":"2024-01-09T19:54:10+00:00","og_image":[{"width":840,"height":270,"url":"https:\/\/cbrell.de\/blog\/wp-content\/uploads\/2024\/01\/python-csharp-svg-logokette-by-claus-brell.png","type":"image\/png"}],"author":"Claus Brell","twitter_card":"summary_large_image","twitter_creator":"@clausbrell5859","twitter_site":"@clausbrell","twitter_misc":{"Verfasst von":"Claus Brell","Gesch\u00e4tzte Lesezeit":"4\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/cbrell.de\/blog\/svg-diagramm-erzeugen-mit-python-und-c-im-vergleich\/#article","isPartOf":{"@id":"https:\/\/cbrell.de\/blog\/svg-diagramm-erzeugen-mit-python-und-c-im-vergleich\/"},"author":{"name":"Claus Brell","@id":"https:\/\/cbrell.de\/blog\/#\/schema\/person\/7cf529e46faf1fd7b2b6942fec254c58"},"headline":"SVG Diagramm erzeugen mit Python und C# im Vergleich","datePublished":"2024-01-09T19:28:41+00:00","dateModified":"2024-01-09T19:54:10+00:00","mainEntityOfPage":{"@id":"https:\/\/cbrell.de\/blog\/svg-diagramm-erzeugen-mit-python-und-c-im-vergleich\/"},"wordCount":3096,"commentCount":0,"image":{"@id":"https:\/\/cbrell.de\/blog\/svg-diagramm-erzeugen-mit-python-und-c-im-vergleich\/#primaryimage"},"thumbnailUrl":"https:\/\/cbrell.de\/blog\/wp-content\/uploads\/2024\/01\/python-csharp-svg-logokette-by-claus-brell.png","keywords":["C","csharp","Datenvisualisierung","Programmierung","Python","SVG"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/cbrell.de\/blog\/svg-diagramm-erzeugen-mit-python-und-c-im-vergleich\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/cbrell.de\/blog\/svg-diagramm-erzeugen-mit-python-und-c-im-vergleich\/","url":"https:\/\/cbrell.de\/blog\/svg-diagramm-erzeugen-mit-python-und-c-im-vergleich\/","name":"SVG Diagramm erzeugen mit Python und C# im Vergleich - Bienen, Natur und Internet of Things","isPartOf":{"@id":"https:\/\/cbrell.de\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cbrell.de\/blog\/svg-diagramm-erzeugen-mit-python-und-c-im-vergleich\/#primaryimage"},"image":{"@id":"https:\/\/cbrell.de\/blog\/svg-diagramm-erzeugen-mit-python-und-c-im-vergleich\/#primaryimage"},"thumbnailUrl":"https:\/\/cbrell.de\/blog\/wp-content\/uploads\/2024\/01\/python-csharp-svg-logokette-by-claus-brell.png","datePublished":"2024-01-09T19:28:41+00:00","dateModified":"2024-01-09T19:54:10+00:00","author":{"@id":"https:\/\/cbrell.de\/blog\/#\/schema\/person\/7cf529e46faf1fd7b2b6942fec254c58"},"breadcrumb":{"@id":"https:\/\/cbrell.de\/blog\/svg-diagramm-erzeugen-mit-python-und-c-im-vergleich\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cbrell.de\/blog\/svg-diagramm-erzeugen-mit-python-und-c-im-vergleich\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/cbrell.de\/blog\/svg-diagramm-erzeugen-mit-python-und-c-im-vergleich\/#primaryimage","url":"https:\/\/cbrell.de\/blog\/wp-content\/uploads\/2024\/01\/python-csharp-svg-logokette-by-claus-brell.png","contentUrl":"https:\/\/cbrell.de\/blog\/wp-content\/uploads\/2024\/01\/python-csharp-svg-logokette-by-claus-brell.png","width":840,"height":270},{"@type":"BreadcrumbList","@id":"https:\/\/cbrell.de\/blog\/svg-diagramm-erzeugen-mit-python-und-c-im-vergleich\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/cbrell.de\/blog\/"},{"@type":"ListItem","position":2,"name":"SVG Diagramm erzeugen mit Python und C# im Vergleich"}]},{"@type":"WebSite","@id":"https:\/\/cbrell.de\/blog\/#website","url":"https:\/\/cbrell.de\/blog\/","name":"Bienen, Natur und Internet of Things","description":"Alles, was einfach ist. Von Claus Brell","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cbrell.de\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Person","@id":"https:\/\/cbrell.de\/blog\/#\/schema\/person\/7cf529e46faf1fd7b2b6942fec254c58","name":"Claus Brell","description":"Seit 2021 forsche ich an und mit Bienen (Digitalisierung der Imkerei) Seit 2012 Professur f\u00fcr Wirtschaftsinformatik an der Hochschue Niederrhein. Seit 1981 treibt mich die Frage um: Was haben Physik, Heavy Metal und Spiele miteinander zu tun? Drei m\u00f6gliche Antworten: {nichts | 42 | gleiche Hirnareale werden aktiviert}","sameAs":["http:\/\/claus-brell.de","https:\/\/x.com\/clausbrell5859","https:\/\/www.youtube.com\/@clausbrell5859"],"url":"https:\/\/cbrell.de\/blog\/author\/clausb\/"}]}},"_links":{"self":[{"href":"https:\/\/cbrell.de\/blog\/wp-json\/wp\/v2\/posts\/4093","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cbrell.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cbrell.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cbrell.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cbrell.de\/blog\/wp-json\/wp\/v2\/comments?post=4093"}],"version-history":[{"count":16,"href":"https:\/\/cbrell.de\/blog\/wp-json\/wp\/v2\/posts\/4093\/revisions"}],"predecessor-version":[{"id":4114,"href":"https:\/\/cbrell.de\/blog\/wp-json\/wp\/v2\/posts\/4093\/revisions\/4114"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cbrell.de\/blog\/wp-json\/wp\/v2\/media\/4113"}],"wp:attachment":[{"href":"https:\/\/cbrell.de\/blog\/wp-json\/wp\/v2\/media?parent=4093"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cbrell.de\/blog\/wp-json\/wp\/v2\/categories?post=4093"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cbrell.de\/blog\/wp-json\/wp\/v2\/tags?post=4093"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}