Frage

Ich habe einige Daten aus einer Datenbank (SQLite), Abbilden einen Wert (eine ganze Zahl) zu einem Datum. Ein Datum ist ein String mit folgendem Format: YYYY-MM-DD hh:mm. Die Termine sind nicht gleichmäßig verteilt sind. Will ich ein Liniendiagramm mit den Daten auf X und die Werte auf Y ziehen. Was ist der einfachste Weg, dies mit Perl zu tun?

Ich habe versucht, DBIx :: Chart aber ich konnte es nicht meine Daten machen erkennen . Ich habe auch versucht GD :: Graph , aber wie die Dokumentation sagt:

  

GD :: Graph unterstützt keine numerischen x   Achse so, wie es sollte. Daten für X   Achsen sollten gleich beabstandet sein

War es hilfreich?

Lösung

können Sie fahren gnuplot mit Übersicht :: Gnuplot .

Alternativ, wenn SVG ein akzeptabler Ausgabeformat ist, gibt es SVG :: TT :: Graph .

Andere Tipps

Sie können mit Übersicht :: Clicker Achse :: Datetime:

#!/usr/local/bin/perl -w
use strict;
use Chart::Clicker;
use Chart::Clicker::Axis::DateTime;
use Chart::Clicker::Data::Series;
use Chart::Clicker::Data::DataSet;
use Chart::Clicker::Renderer::Point;

my $cc = Chart::Clicker->new;
my $series = Chart::Clicker::Data::Series->new(
    values    => [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ],
    keys      => [
        1256147117, 1256148117, 1256149117, 1256150117, 1256151117, 1256152117,
        1256153117, 1256154117, 1256155117, 1256156117
    ],
);
my $ctx = $cc->get_context('default');
$ctx->domain_axis(Chart::Clicker::Axis::DateTime->new(position => 'bottom', orientation     => 'horizontal'));
my $ds = Chart::Clicker::Data::DataSet->new(series => [ $series ]);
$cc->add_to_datasets($ds);
$cc->write_output('foo.png');

Sie haben Ihre Zeiten in Unix-Zeitstempel konvertieren, aber es DWIMs.

  

Ich habe versucht DBIx :: Chart, aber ich konnte es nicht meine Daten machen erkennen.

Haben Sie versucht, Ihre Daten zu Unix-Zeitstempel zu übersetzen und sie als X Daten verwenden?

Dies hat den Trick für mich:

my $ctx = $chart->get_context('default');
$ctx->domain_axis(
    Chart::Clicker::Axis::DateTime->new(
        position        => 'bottom',
        orientation     => 'horizontal',
        ticks           => 5 ,
        format          => "%Y-%m-%d"
    )
);

Der einfachste Weg, die ich gefunden habe dies mit Perl zu tun ist, um das Perl zu verwenden, um einen gnuplot-Prozess ausgeführt. Sie können set timefmt x "%Y-%m-%d" verwenden und es werden die Daten in dem Format, das Sie automatisch analysieren. Gnuplot unterstützt auch eine Vielzahl von Ausgabeformaten.

Ich würde empfehlen, die Daten auf ganze Zahlen zu normalisieren. Der Brute-Force-Weg wäre natürlich Epoche Sekunden verwenden, aber das ist vielleicht nicht zu schön aussieht auf einem Graphen, so normalisiert durch eine lineare Transformation in eine gute Auswahl (I liefern Details, wie wenn Sie möchten).

Haben Sie Ihr Diagramm müssen in Echtzeit erzeugt werden, oder ist für einen einmaligen Bericht? Wenn letzteres, dann können Sie Datetime-Module verwenden, um Excel-Werte zu generieren und grafisch darzustellen sie in Excel (oder seinem Open-Source-Pendant.)

use DateTime::Format::MySQL;
use DateTime::Format::Excel;

my $dt = DateTime::Format::MySQL->parse_datetime( '2003-01-16 23:12:01' );
print $dt, "\n";
my $daynum = DateTime::Format::Excel->format_datetime($dt);
print $daynum, "\n";

Zeit her, dass ich so etwas wie dies mit Asymptote . Es ist ein unglaubliches Paket, aber es ist nicht einfach zu bedienen.

Im Folgenden wird nicht in SQLLite arbeiten als rekursive Abfragen nicht unterstützt werden, aber es wird in Oracle arbeiten.

Sie können eine kontinuierliche Zeitreihen für Oracle dBs mit einer Unterabfrage wie folgt erstellen:

(SELECT   TRUNC (SYSDATE - x / 1440, 'MI') ts
             FROM   (SELECT       LEVEL x
                           FROM   DUAL
                     CONNECT BY   LEVEL <= 60))

verknüpfen dann diese Zeitreihe auf Ihre Kartendaten mit einem LEFT JOIN wie folgt aus:

    SELECT   TO_CHAR (A.TS, 'DD/MM/YYYY HH24:MI') TS
        , b.DATAPOINT1, b.DATAPOINT2
   FROM   (SELECT   TRUNC (SYSDATE - x / 1440, 'MI') ts
             FROM   (SELECT       LEVEL x
                           FROM   DUAL
                     CONNECT BY   LEVEL <= 60)) a
        , MY_CHART_DATA b
  WHERE   a.ts = b.ts(+) ORDER BY   a.TS;

Das obige Beispiel die letzten 60 Minuten plotten und arbeiten ** mit DBIx :: Chart. Um die Auflösung zu Stunden ändern ‚MI‘ auf ‚HH24‘ zu ändern, oder für alle 24 Stunden können Sie die Datumsformat-Parameter alle zusammen weggelassen werden.

der Bereich einfach die CONNECT auf die Anzahl der Zeitreihen Punkte, die Sie bei Ihrer angegebenen Auflösung plotten müssen BY LEVEL Wert zu ändern.

** Hinweis: DBIx :: Chart kotzen, wenn alle Datenpunktwerte gleich Null sind (dh nicht definiert.). Können Sie nicht helfen, sorry.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top