Pregunta

Tengo algunos datos de una base de datos (SQLite), asignando un valor (un entero) a una fecha. Una fecha es una cadena con este formato: YYYY-MM-DD hh: mm . Las fechas no están distribuidas uniformemente. Quiero hacer un gráfico de líneas con las fechas en X y los valores en Y . ¿Cuál es la forma más fácil de hacer esto con Perl?

Probé DBIx :: Chart pero no pude hacer que reconociera mis fechas . También probé GD :: Graph , pero como dice la documentación:

  

GD :: Graph no admite x numérica   Eje de la manera que debería. Datos para x   Los ejes deben estar espaciados por igual

¿Fue útil?

Solución

Puede conducir gnuplot utilizando Chart :: Gnuplot .

Alternativamente, si SVG es un formato de salida aceptable, hay SVG :: TT :: Gráfico .

Otros consejos

Puedes usar 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');

Tienes que convertir tus tiempos en marcas de tiempo Unix, pero es DWIMs.

  

Probé DBIx :: Chart pero no pude hacer que reconociera mis fechas.

¿Ha intentado traducir sus fechas a Unix-Timestamps y usarlas como X fechas?

Esto hizo el truco para mí:

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

La forma más fácil que he encontrado para hacer esto con Perl es usar Perl para ejecutar un proceso gnuplot. Puede usar set timefmt x "% Y-% m-% d " y analizará automáticamente los datos en el formato que tenga. Gnuplot también admite una variedad de formatos de salida.

Recomendaría normalizar las fechas a números enteros. La forma de la fuerza bruta sería, por supuesto, usar una época de segundos, pero puede que no se vea muy bien en una gráfica, por lo que se normaliza mediante una transformación lineal en algún rango decente (puedo proporcionar detalles de cómo hacerlo).

¿Necesita que su gráfico se genere en tiempo real o es para un informe único? Si es lo último, entonces puede usar los módulos DateTime para generar valores de Excel y graficarlos en Excel (o su contraparte de código abierto).

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

Hace tiempo, hice algo como esto usando Asymptote . Es un paquete increíble, pero no es fácil de usar.

Lo siguiente no funcionará en SQLLite, ya que las consultas recursivas no son compatibles, pero funcionará en Oracle.

Puede crear una serie de tiempo continua para Oracle dBs con una subconsulta como esta:

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

Luego vincule esa serie de tiempo a los datos de su gráfico mediante una JUNTA IZQUIERDA como esta:

    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;

El ejemplo anterior trazará los últimos 60 minutos y funcionará ** con DBIx :: Chart. Para cambiar la resolución a horas, cambie 'MI' a 'HH24', o por cada 24 horas puede omitir el parámetro de formato de fecha todos juntos.

Para cambiar el rango, simplemente establezca el valor CONECTAR POR NIVEL a la cantidad de puntos de la serie de tiempo que necesita trazar en su resolución específica.

** Nota: DBIx :: Chart barf si todos los valores de punto de datos son cero (es decir, no definido). No puedo ayudarte allí, lo siento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top