FHEM Forum

FHEM => Frontends => SVG / Plots / logProxy => Thema gestartet von: betateilchen am 06 Juni 2018, 12:43:28

Titel: 98_SVG.pm - sprintf() bei Achsenbeschriftung
Beitrag von: betateilchen am 06 Juni 2018, 12:43:28
Hallo Rudi,

gibt es eine einfache Möglichkeit (die ich nur noch nicht gefunden habe), die Formatierung der Beschriftung der y-Achse anzupassen?

Im angehängten Screenshot wäre es schöner, wenn da 1.20 und 1.30 stehen würde anstatt 1.2 und 1.3.
Die Werte sind nicht als tics vorgegeben, sondern werden automatisch berechnet.
Titel: Antw:98_SVG.pm - sprintf() bei Achsenbeschriftung
Beitrag von: rudolfkoenig am 06 Juni 2018, 13:22:46
Nein, in Zeile 1907 steht
        my $txt = sprintf("%g", $i);damit ist das Format fest. Wenn du eine Idee hast...
Titel: Antw:98_SVG.pm - sprintf() bei Achsenbeschriftung
Beitrag von: betateilchen am 06 Juni 2018, 14:19:46
Zitat von: rudolfkoenig am 06 Juni 2018, 13:22:46
Wenn du eine Idee hast...

ich denke mal drüber nach  8)

Spontan fällt mir ysprintf als optionaler Parameter im gplot File ein, dann könnte man das sogar für jede y-Achse getrennt setzen.
Titel: Antw:98_SVG.pm - sprintf() bei Achsenbeschriftung
Beitrag von: betateilchen am 06 Juni 2018, 15:03:48
Das funktioniert bei mir im Testbetrieb:



--- code entfernt wegen aktueller Überarbeitung --- (19:00 Uhr)




set ytics
set ylabel "links"
set ysprintf %03d


Was ich nicht getestet habe, ist der Betrieb mit mehr als 2 y-Achsen. Aber werden mehr als zwei Achsen überhaupt beschriftet?
Titel: Antw:98_SVG.pm - sprintf() bei Achsenbeschriftung
Beitrag von: Frank_Huber am 06 Juni 2018, 15:06:05
Zitat von: betateilchen am 06 Juni 2018, 15:03:48
Was ich nicht getestet habe, ist der Betrieb mit mehr als 2 y-Achsen. Aber werden mehr als zwei Achsen überhaupt beschriftet?

Ja, werden sie. auch 2 links zwei rechts. (angehängt)
Titel: Antw:98_SVG.pm - sprintf() bei Achsenbeschriftung
Beitrag von: betateilchen am 06 Juni 2018, 16:22:28
ok, dann muss man vermutlich im ersten Teil einfach den Zähler anpassen.

Und man könnte das Ganze noch dadurch "schön" machen, dass man das Ganze auch noch als perl evaluiert, um selbst den Formatierungsstring noch "berechnen" zu lassen.

Aber Rudi wollte ja auch nur eine Idee haben :)
Titel: Antw:98_SVG.pm - sprintf() bei Achsenbeschriftung
Beitrag von: betateilchen am 06 Juni 2018, 19:28:06
verbesserter patch-Vorschlag...


Index: 98_SVG.pm
===================================================================
--- 98_SVG.pm   (revision 16823)
+++ 98_SVG.pm   (working copy)
@@ -1503,6 +1503,15 @@
       SVG_pO "<text x=\"$off1\" y=\"$off2\" text-anchor=\"middle\" " .
           "class=\"y2label\" transform=\"rotate(270,$off1,$off2)\">$t</text>";
     }
+
+    ######################
+    # use sprintf for y tics
+    for my $idx ($use_left_axis+1..$use_left_axis+$use_right_axis)  {
+      my $name = "y".($idx)."sprintf";
+      $name = "ysprintf" if( $idx == 1 );
+      $conf{$name} //= "%g";
+    }
+
   }

   ######################
@@ -1882,6 +1891,8 @@
       }
     #-- tics automatically
     } elsif( $hstep{$a}>0 ) {           
+      my $n = 'y'.($axis).'sprintf';
+      $n = 'ysprintf' if ($axis == 1);
       for(my $decimal = 0;
           $decimal < ($log eq 'log'?SVG_log10($hmax{$a}):1);
           $decimal++ ) {
@@ -1904,7 +1915,7 @@
         }
         $off2 += $th/4;
         #--  text   
-        my $txt = sprintf("%g", $i);
+        my $txt = sprintf($conf{$n}, $i);
         SVG_pO
           "<text x=\"$off1\" y=\"$off2\" class=\"ylabel\"$align>$txt</text>";
       }
Titel: Antw:98_SVG.pm - sprintf() bei Achsenbeschriftung
Beitrag von: rudolfkoenig am 07 Juni 2018, 12:25:59
Habe den Patch etwas vereinfacht eingecheckt, bitte pruefen, ob noch alles funktioniert.

Zusammenfassug: mit folgender Zeile in der .gplot Datei:
set ysprintf %0.2f
(bzw. y2sprintf fuer die anderen Achsen) kann man die Formatierung der automatisch berechneten Werte auf der Y-Achsen beeinflussen, Argument ist eine sprintf Formatanweisung, sprintf kriegt als zweiten Parameter den numerischen Wert auf der y-Achse.

Achtung: diese Konfiguration geht beim Speichern durch den Plot-Editor verloren.
Titel: Antw:98_SVG.pm - sprintf() bei Achsenbeschriftung
Beitrag von: betateilchen am 07 Juni 2018, 13:16:09
Zitat von: rudolfkoenig am 07 Juni 2018, 12:25:59
Habe den Patch etwas vereinfacht eingecheckt

An der Stelle, wo Du das jetzt eingebaut hast, hatte ich das im ersten Versuch auch. Das funktioniert zwar, allerdings wird dadurch innerhalb der loop für jeden einzelnen tic auf der y-Achse der sprintf-Formatstring erneut ermittelt, obwohl sich dieser auf einer Achse überhaupt nicht mehr ändert.

Deshalb hatte ich die Ermittlung des Formatstring in meinem Vorschlag direkt nach das elsif hochgeschoben. Dadurch erfolgt diese pro Achse nur einmal.