SVG: Plot mit Steps sollte jetzt enden

Begonnen von Dr. Boris Neubert, 01 Dezember 2025, 20:30:37

Vorheriges Thema - Nächstes Thema

Dr. Boris Neubert

Hallo,

der richtige Stil wäre dann fsteps statt steps.

Viele Grüße
Boris
FHEM-Developer seit 2007, Mitgründer und Förder-Mitglied des FHEM e.V.
Bitte keine unaufgeforderten privaten Nachrichten!

rudolfkoenig

Nach der Definition von xenos1984 weiter oben:
Zitatsteps: Der Wert gilt ab dem gemeldeten Zeitpunkt, so lange, bis ein neuer Wert gemeldet wird. Nach dem letzten gemeldeten Wert gilt dieser weiterhin.
fsteps: Der Wert gilt bis zum gemeldeten Zeitpunkt. Nach dem letzten gemeldeten Wert sind keine aktuellen Daten vorhanden.
histeps: Der Wert gilt für ein bestimmtes Zeitintervall, das sich um den Meldezeitpunkt erstreckt.
sehe ich eher histeps als den richtigen Plot-Type.
 

knorxi

Danke euch! Mit fsteps oder histeps funktioniert es  ;D

noansi

Hallo Rudolf,

in Verbindung mit logProxy_xy2Plot zur Darstellung von Daten ohne absoluten Zeitbezug (z.B. set xrange [0:200000]) und Nutzung von steps im zugehörigen gplot File zeigt sich am Ende des Plots eine unschöne Zusatzlinie zu dem neuen $x+$nx,$ly in Zeile 2025.
        $ret .= sprintf(" %d,%d %d,%d", $lx,$ly, $x+$nx,$ly);
Aufgefallen ist mir das bei der Darstellung von digitalen Signalwerten, also Rechtecksignalwerten, die ich mit steps ausgegeben hatte. Das zu den Nebenwirkungen auf Sonderfälle.


Da ich die Erzeugung der Daten in der Hand habe, dachte ich, einfach auf lines statt steps umzustellen. Jedoch ist lines mit mit Filtereigenschaften verbunden, so dass die letzte Signalflanke, welche aus Abfall von 1 auf 0 bei identischem x-Wert und nochmaligem 0 Wert bei identischem x-Wert besteht, rausgefiltert wird.
Wenn Zeile 2202
        next if($x1 == $lx && $y1 == $ly);entfällt, dann wird es korrekt dargestellt, da dann die Abfrage auf den letzten Dateneintrag $i < $maxIdx in Zeile 2205 für die Ausgabe des Signalabfalls sorgt.

Ebenso funktioniert zur Erhaltung des Optimierungsgedankens von Zeile 2202
            ($x1, $y1) = (int($x+$dxp->[$i]),
                          int($y+$h-($dyp->[$i]-$min)*$hmul));

            # calc ymin/ymax for points with the same x coordinates
            if ($x1 == $lx && $i < $maxIdx) {
              next if ($y1 == $ly);
              $ymin = $y1 if($y1 < $ymin);
              $ymax = $y1 if($y1 > $ymax);
              $ly = $y1;
              next;
            }

statt

        ($x1, $y1) = (int($x+$dxp->[$i]),
                         int($y+$h-($dyp->[$i]-$min)*$hmul));

        next if($x1 == $lx && $y1 == $ly);

        # calc ymin/ymax for points with the same x coordinates
        if($x1 == $lx && $i < $maxIdx) {
          $ymin = $y1 if($y1 < $ymin);
          $ymax = $y1 if($y1 > $ymax);
          $ly = $y1;
          next;
        }

Natürlich kann ich auch mit mehr Code-Komplexität bei der Datenerzeugung meiner Daten die Wertpaardopplung am Ende entfernen, das Verhalten von lines in 98_SVG.pm bleibt jedoch bei hoher Datendichte am Plotende im Bezug auf Weglassen der Ausgabe am Plotende kritisch, wegen int(...) im Vorfeld zur Erzeugung von $x1 und $y1.


Dann noch im Bezug auf die Ausgabe eines einzelnen Datenpaares bei fsteps, histeps und ibars, mich irrtiert die Darstellung über die gesammte Plotbreite $w
      if(@{$dxp} == 1) {
          my $y1 = $y+$h-($dyp->[0]-$min)*$hmul;
          $ret .=  sprintf(" %d,%d %d,%d %d,%d %d,%d",
                $x,$y+$h, $x,$y1, $x+$w,$y1, $x+$w,$y+$h);
      } else {
Mal beobachtet als Rain/h Extrapolation über einen ganzen Tag wegen eines Einzelwertes kurz nach Mitternacht dargestellt.

Eine Annäherung dieser Einzelpunktdarstellung an die Definition
Zitatsteps: Der Wert gilt ab dem gemeldeten Zeitpunkt, so lange, bis ein neuer Wert gemeldet wird. Nach dem letzten gemeldeten Wert gilt dieser weiterhin.
fsteps: Der Wert gilt bis zum gemeldeten Zeitpunkt. Nach dem letzten gemeldeten Wert sind keine aktuellen Daten vorhanden.
histeps: Der Wert gilt für ein bestimmtes Zeitintervall, das sich um den Meldezeitpunkt erstreckt.
sehe ich als wünschenswert.

Gruß, Ansgar.