98_SVG.pm - sprintf() bei Achsenbeschriftung

Begonnen von betateilchen, 06 Juni 2018, 12:43:28

Vorheriges Thema - Nächstes Thema

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

Nein, in Zeile 1907 steht
        my $txt = sprintf("%g", $i);damit ist das Format fest. Wenn du eine Idee hast...

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

#3
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?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Frank_Huber

#4
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)

betateilchen

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 :)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

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>";
       }
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

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.

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!