SVG x-Achsenbeschriftung verschieben

Begonnen von Zenz, 03 Januar 2019, 13:05:38

Vorheriges Thema - Nächstes Thema

Zenz

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

rudolfkoenig

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.

Zenz

@ Rudolf
Leider ist Programmcode ändern, wegen mangelnder Programmierkenntnisse, für mich keine Option.

Aber trotzdem herzlichen Danke für deine Antwort.

bema15

#3
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.

       
  • Bei Zoomfaktoren von kleinergleich einem Tag bleibt es so wie es war.
  • Bei Zoomfaktoren von einer Woche oder größer werden die x-Achse Werte mittig zwischen den Intervallen angezeigt.
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:

       
  • Tics und Grid können bei einem Alignment über den rechten Rand laufen, beim Jahreszoom zu erkennen an "Jan" des Folgejahres.
  • Bei der 10- und 20-Jahre Skalierung wurden die vertikalen Gridlinien etwa in der Mitte des Jahres gezeichnet und nicht am Anfang des Jahres. Habe deswegen ein Alignment auf den Anfang des Jahres (align=3) in der Routine SVG_time_align($$) eingefügt.
Viele Grüße
Bema

mario99

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..

Shadow3561

Finde es auch besser so.
Evtl übernimmt es rudolfkoenig ja.

Mit freundlichen Grüßen

sigma415

#6
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 ?
FHEM auf ubuntu-Server (Notebook), CUNO's via LAN, 3x HMLAN, 2x goE, Tasmota-Devices via MQTT, Home Connect, Velux-KLF200, Harmony, SMA STP10, SMA HM2.0, BYD HVS7.7, etc. pp.  ....
Und immer noch viele, viele (Alt-) HM's (ohne -IP).

bema15

Ich denke, dass eine Anpassung notwendig sein wird.
In dem Thread 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?

gichtl

#8
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.

rudolfkoenig


sigma415

Vielen Dank an alle Beteiligten.
Funktioniert wie gewünscht  :)
FHEM auf ubuntu-Server (Notebook), CUNO's via LAN, 3x HMLAN, 2x goE, Tasmota-Devices via MQTT, Home Connect, Velux-KLF200, Harmony, SMA STP10, SMA HM2.0, BYD HVS7.7, etc. pp.  ....
Und immer noch viele, viele (Alt-) HM's (ohne -IP).