Domanda

Ho alcuni dati da un database (SQLite), mappando un valore (un numero intero) su una data. Una data è una stringa con questo formato: YYYY-MM-DD hh: mm . Le date non sono distribuite uniformemente. Voglio fare un grafico a linee con le date su X e i valori su Y . Qual è il modo più semplice per farlo con Perl?

Ho provato DBIx :: Chart ma non sono riuscito a far riconoscere le mie date . Ho anche provato GD :: Graph , ma come dice la documentazione:

  

GD :: Graph non supporta x numerici   asse come dovrebbe. Dati per X   gli assi dovrebbero essere equidistanti

È stato utile?

Soluzione

Puoi guidare gnuplot utilizzando Grafico :: Gnuplot .

In alternativa, se SVG è un formato di output accettabile, esiste SVG :: TT :: Graph .

Altri suggerimenti

Puoi usare Chart :: Clicker Axis :: 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');

Devi convertire i tuoi tempi in timestamp Unix, ma DWIMs.

  

Ho provato DBIx :: Chart ma non sono riuscito a far riconoscere le mie date.

Hai provato a tradurre le tue date in Unix-Timestamps e usarle come date X?

Questo ha fatto il trucco per me:

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

Il modo più semplice che ho trovato per fare questo con Perl è usare Perl per eseguire un processo gnuplot. Puoi utilizzare set timefmt x "% Y-% m-% d " e analizzerà automaticamente i dati nel formato che hai. Gnuplot supporta anche una varietà di formati di output.

Consiglierei di normalizzare le date in numeri interi. Il modo della forza bruta sarebbe ovviamente usare i secondi di epoca, ma potrebbe non sembrare troppo bello su un grafico, quindi normalizzalo con una trasformazione lineare in un intervallo decente (posso fornire dettagli su come desideri).

Hai bisogno che il tuo grafico sia generato in tempo reale o è per un rapporto unico? In quest'ultimo caso, puoi utilizzare i moduli DateTime per generare valori di Excel e rappresentarli graficamente in Excel (o nella sua controparte open source)

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";

Tempo fa ho fatto qualcosa del genere usando Asymptote . È un pacchetto incredibile, ma non è facile da usare.

Quanto segue non funzionerà in SQLLite poiché le query ricorsive non sono supportate, ma funzionerà in Oracle.

Puoi creare una serie temporale continua per dB dB Oracle con una subquery come questa:

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

Quindi collega le serie storiche ai dati del tuo grafico usando un JOIN SINISTRA in questo modo:

    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;

L'esempio sopra traccerà gli ultimi 60 minuti e funzionerà ** con DBIx :: Chart. Per modificare la risoluzione in ore, modifica "MI" in "HH24" oppure, ogni 24 ore, puoi omettere tutti i parametri del formato della data.

Per modificare l'intervallo è sufficiente impostare il valore CONNECT BY LEVEL sul numero di punti della serie temporale che è necessario tracciare alla risoluzione specificata.

** Nota: DBIx :: Il grafico fallirà se tutti i valori del punto dati sono zero (cioè non definito). Non posso aiutarti, scusa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top