FHEM Forum

FHEM => Frontends => SVG / Plots / logProxy => Thema gestartet von: Zenz am 03 Januar 2019, 13:05:38

Titel: SVG x-Achsenbeschriftung verschieben
Beitrag von: Zenz am 03 Januar 2019, 13:05:38
Hallo zusammen!

Ich habe mir schon einen Wolf gegoogelt, kann aber zu folgendem Problem leider nichts finden.

Ich verwende für meine Photovoltaik Anlage ein Balkendiagram (Jahr), jedoch beginnt die x-Achsen Beschriftung
mit Feb und ist noch dazu zwischen den einzelnen Balken (siehe Anhang).

Würde mich freuen, wenn mir jemand einen Tipp geben könnte, wie ich das ändern könnte.

Vielen Dank
Zenz
Titel: Antw:SVG x-Achsenbeschriftung verschieben
Beitrag von: rudolfkoenig am 03 Januar 2019, 15:51:48
Januar ist mit Absicht weg, weil es sonst mit der Jahreszahl zusammenklebt.
Und die Monatsbeschriftungen sind (wie alle Beschriftungen) jeweils am Anfang, die Balken bedecken aber das gesamte Intervall.
Insofern: alles Absicht. Wenn es Dir so nicht gefaellt, musst den Programmcode aendern.
Titel: Antw:SVG x-Achsenbeschriftung verschieben
Beitrag von: Zenz am 03 Januar 2019, 17:32:11
@ Rudolf
Leider ist Programmcode ändern, wegen mangelnder Programmierkenntnisse, für mich keine Option.

Aber trotzdem herzlichen Danke für deine Antwort.
Titel: Antw:SVG x-Achsenbeschriftung verschieben
Beitrag von: bema15 am 30 Januar 2019, 14:33:39
Also ich sehe dies etwas differenzierter. Wenn an der x-Achse ein Zeitpunkt beschriftet werden soll, also eine Uhrzeit, dann sollte dies genau an diesem Punkt, also der vertikalen Gridlinie erfolgen. So wie es bisher der Fall ist.
Wenn allerdings an der x-Achse ein Zeitraum, also Tag, Monat oder Jahr, beschriftet werden soll, dann sollte dies mittig zu dem entsprechenden Intervall erfolgen. Dann ist die Zuordnung einfacher und weniger irritierend.

Ich habe deswegen das Modul 98_SVG.pm dahingehend angepasst.
Als Beispiel ist anbei ein Screenshot von einem Jahres-Chart.

Ich stelle diese Änderung gerne zur Verfügung. Anbei der Patch zu der 98_SVG.pm erstellt mit:
diff -u 98_SVG.pm_Original 98_SVG.pm > 98_SVG.pm.patch

Beim Programmieren dieser Änderung sind mir zwei Fehler aufgefallen, die ich gleich korrigiert habe:
Viele Grüße
Bema
Titel: Antw:SVG x-Achsenbeschriftung verschieben
Beitrag von: mario99 am 06 April 2020, 20:24:51
Danke für diese Lösung. Funktioniert einwandfrei.

Ich musste nur die Differenzen manuell in die heutige 98_SVG.pm eintragen, da sich das File geändert hat..
Titel: Antw:SVG x-Achsenbeschriftung verschieben
Beitrag von: Shadow3561 am 07 April 2020, 18:35:01
Finde es auch besser so.
Evtl übernimmt es rudolfkoenig ja.

Mit freundlichen Grüßen
Titel: Antw:SVG x-Achsenbeschriftung verschieben
Beitrag von: sigma415 am 23 März 2021, 14:37:44
Passen die Patches von bema15 auch noch auf die aktuelle 98_SVG.pm ? (Id: 98_SVG.pm 23936 2021-03-12 20:40:53Z rudolfkoenig $)
Oder gibt es zwischenzeitlich eine andere Lösung für das Problem ?
Titel: Antw:SVG x-Achsenbeschriftung verschieben
Beitrag von: bema15 am 24 März 2021, 12:36:26
Ich denke, dass eine Anpassung notwendig sein wird.
In dem Thread https://forum.fhem.de/index.php/topic,118907.0.html (https://forum.fhem.de/index.php/topic,118907.0.html) wird ja das Problem in der 10 Jahres Darstellung behandelt. Dieses hatte ich in dem obigen Patch ja auch schon angemerkt und korrigiert.  Eventuell kann es da einen Konflikt geben. Das müsste man näher betrachten.
Oder hat jemand da schon eine Lösung parat?
Titel: Antw:SVG x-Achsenbeschriftung verschieben
Beitrag von: gichtl am 24 März 2021, 21:11:39
Ich habe bei mir sowohl in der Jahresdarstellung die Monate als auch in der 10-Jahres Darstellung die Jahreszahlen zentriert. Auch die Beschriftung vom ersten Intervall ist bei mir sichbar und wird ggf. linksbündig an der Y-Achse ausgerichtet, damit der nicht mit der Jahreszahl kollidiert. Auch die komplizierte Berechnung mit dem $initoffset in der for-Schleife habe ich komplett eliminiert. Dadurch wird der Code übersichtlicher, und die Zentrierung der Monatsnamen und Jahreszahlen läßt sich bequem mit dem Ausdruck +$step/2 für das $off1 bewerkstelligen. Oder meinetwegen auch konfigurierbar machen.

Hier also der Patch aus dem 10-Jahres Thread mit zusätzlicher Zentrierung:


diff U3 /fhem/FHEM/98_SVG.pm.Original /fhem/FHEM/98_SVG.pm
--- /fhem/FHEM/98_SVG.pm.Original
+++ /fhem/FHEM/98_SVG.pm
@@ -1651,7 +1651,7 @@
     }
     $tstep = $step;
     $first_tag="";   $tag=". 6";
-    $aligntext = 2; $aligntics = 2;
+    $aligntext = 3; $aligntics = 3;
   }

   my $barwidth = $tstep;
@@ -1674,12 +1674,14 @@
     }

   } else { # times
-    $initoffset = int(($tstep/2)/86400)*86400 if($aligntics == 1);
-    for(my $i = $fromsec+$initoffset; $i < $tosec; $i += $tstep) {
+    for(my $i = $fromsec; $i < $tosec; $i += $tstep) {
       $i = SVG_time_align($i,$aligntics);
       $off1 = int($x+($i-$fromsec)*$tmul);
-      SVG_pO "<polyline class='SVGplot' points='$off1,$y $off1,$off2'/>";
-      SVG_pO "<polyline class='SVGplot' points='$off1,$off3 $off1,$off4'/>";
+      if ($off1 > $x+8 && $off1 < $x+$w-8)
+      {
+        SVG_pO "<polyline class='SVGplot' points='$off1,$y $off1,$off2'/>";
+        SVG_pO "<polyline class='SVGplot' points='$off1,$off3 $off1,$off4'/>";
+      }
     }

   }
@@ -1731,14 +1733,29 @@
     }

   } else { # times
-    $initoffset = 86400 if($aligntext == 1);
-    for(my $i = $fromsec+$initoffset; $i < $tosec; $i += $step) {
+    for(my $i = $fromsec; $i < $tosec; $i += $step) {
       $i = SVG_time_align($i,$aligntext);
-      $off1 = int($x+($i-$fromsec)*$tmul);
+      if ($aligntext >= 2) { # center month and year
+        $off1 = int($x+($i-$fromsec+$step/2)*$tmul);
+      } else {
+        $off1 = int($x+($i-$fromsec)*$tmul);
+      }
       $t = SVG_fmtTime($tag, $i);
-      SVG_pO "<text x=\"$off1\" y=\"$off2\" class=\"ylabel\" " .
-                "text-anchor=\"middle\">$t</text>";
-      SVG_pO "  <polyline points=\"$off1,$y $off1,$off4\" class=\"hgrid\"/>";
+      if ($off1 == $x)
+      {
+        SVG_pO "<text x=\"$off1\" y=\"$off2\" class=\"ylabel\" " .
+                  "text-anchor=\"left\">$t</text>";
+      }
+      elsif ($off1 < $x+$w-8)
+      {
+        SVG_pO "<text x=\"$off1\" y=\"$off2\" class=\"ylabel\" " .
+                  "text-anchor=\"middle\">$t</text>";
+      }
+      $off1 = int($x+($i-$fromsec)*$tmul);
+      if ($off1 > $x+8 && $off1 < $x+$w-8)
+      {     
+        SVG_pO "  <polyline points=\"$off1,$y $off1,$off4\" class=\"hgrid\"/>";
+      }
     }
   }

@@ -2374,11 +2391,12 @@
SVG_time_align($$)
{
   my ($v,$align) = @_;
+  my $wl = $FW_webArgs{detail};
   return $v if(!$align);
   if($align == 1) {             # Look for the beginning of the week
     for(;;) {
       my @a = localtime($v);
-      return $v if($a[6] == 0);
+      return $v if($a[6] == SVG_Attr($FW_wname, $wl, "plotWeekStartDay", 0));
       $v += 86400;
     }
   }
@@ -2389,6 +2407,13 @@
       $v += 86400;
     }
   }
+  if($align == 3) {             # Look for the beginning of the year
+    for(;;) {
+      my @a = localtime($v);
+      return $v if($a[7] == 0);
+      $v += 86400;
+    }
+  }
}

sub


Das funktioniert dann auch mit endPlotToday.
Titel: Antw:SVG x-Achsenbeschriftung verschieben
Beitrag von: rudolfkoenig am 25 März 2021, 17:11:26
Danke, habe den Patch uebernommen.
Titel: Antw:SVG x-Achsenbeschriftung verschieben
Beitrag von: sigma415 am 26 März 2021, 14:11:40
Vielen Dank an alle Beteiligten.
Funktioniert wie gewünscht  :)