如何使用Perl绘制时间序列图?

如何使用Perl绘制时间序列图?,perl,graph,plot,Perl,Graph,Plot,我有一些来自数据库SQLite的数据,将一个值、一个整数映射到一个日期。日期是以下格式的字符串:YYYY-MM-DD hh:MM。日期分布不均匀。我想画一个线图,日期在X上,值在Y上。用Perl做这件事最简单的方法是什么 我试过了,但没能让它认出我的约会对象。我也尝试过,但正如文档所说: GD::Graph不支持数字x 按照它应该做的方式。X的数据 轴线的间距应相等 我尝试了DBIx::Chart,但无法让它识别我的日期 您是否尝试过将日期转换为Unix时间戳并将其用作X日期?我发现使用Perl

我有一些来自数据库SQLite的数据,将一个值、一个整数映射到一个日期。日期是以下格式的字符串:YYYY-MM-DD hh:MM。日期分布不均匀。我想画一个线图,日期在X上,值在Y上。用Perl做这件事最简单的方法是什么

我试过了,但没能让它认出我的约会对象。我也尝试过,但正如文档所说:

GD::Graph不支持数字x 按照它应该做的方式。X的数据 轴线的间距应相等

我尝试了DBIx::Chart,但无法让它识别我的日期


您是否尝试过将日期转换为Unix时间戳并将其用作X日期?

我发现使用Perl执行此操作的最简单方法是使用Perl运行gnuplot进程。您可以使用set timefmt x%Y-%m-%d,它将自动以您拥有的格式解析数据。Gnuplot还支持多种输出格式。

我建议将日期标准化为整数。蛮力的方式当然是使用历元秒,但在图形上看起来可能不太好,所以通过线性变换将其规格化为适当的范围,如果您愿意,我可以提供详细信息。

您可以使用


或者,如果SVG是一种可接受的输出格式,则存在

您可以使用图表::点击器的轴::日期时间:

#!/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');

您必须将时间转换为Unix时间戳,但它是DWIMs。

您需要实时生成图形,还是用于一次性报告?如果是后者,则可以使用DateTime模块生成Excel值,并在Excel或其开源对应项中绘制它们的图形

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

很久以前我用电脑做过类似的事情。这是一个令人难以置信的软件包,但它不容易使用。

这为我带来了窍门:

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

以下内容在SQLLite中不起作用,因为递归查询不受支持,但在Oracle中可以起作用

您可以使用如下子查询为Oracle dBs创建连续时间序列:

(SELECT   TRUNC (SYSDATE - x / 1440, 'MI') ts
             FROM   (SELECT       LEVEL x
                           FROM   DUAL
                     CONNECT BY   LEVEL <= 60))
    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;
然后使用左连接将该时间序列链接到图表数据,如下所示:

(SELECT   TRUNC (SYSDATE - x / 1440, 'MI') ts
             FROM   (SELECT       LEVEL x
                           FROM   DUAL
                     CONNECT BY   LEVEL <= 60))
    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;
上面的示例将绘制最后60分钟,并将**与DBIx::Chart一起使用。若要将分辨率更改为小时,请将“MI”更改为“HH24”,或者每24小时可以同时忽略日期格式参数

要更改范围,只需将“按级别连接”值设置为需要以指定分辨率绘制的时间序列点数


**注意:如果所有数据点值都为零,即未定义,则DBIx::Chart将出现错误。抱歉,我帮不了你。

不行。转换日期的更好方法是什么?那么,我怎样才能在x轴上查看日期而不是时间戳呢?我认为DBIx::Chart不支持这一点。因此,您可以对它进行子分类并添加此功能,或者按照Sinan对Chart::Gnuplot的建议进行操作,我支持这一点。与其因为代码中的一些问题而放弃DBIx::Chart,不如让它识别我的日期,为什么不发布给您带来问题的代码,或许我们可以与您一起调试它?如果我们放弃了解决方案,因为我们最初与他们的合作没有达到我们想要的效果,我们的解决方案很快就会用完。我想避免安装gnuplot,但也许这是更好的做法。我不知道是否安装它更好,但任何图形解决方案都需要您安装一些东西,至少gnuplot已经存在了足够长的时间,它在大多数系统上运行得非常好。这是我最喜欢的图表模块,也是我发现的gnuplot最健全的接口,它不需要向它发送原始命令。我确实用gnuplot绘制了数据,设置了正确的时间格式,看起来不错,但X轴从1985年延伸到2010年以上,而我的日期都在2009年。我仍然需要找到如何对gnuplot说,将X轴设置为仅从第一个日期延伸到las日期。@Jazz您可以设置显示的刻度:您还可以设置范围@Sinan我已经发现,我希望自动范围。事实上,我误用了gnuplot。使用Chart::Gnuplot::DataSet选项timefmt=>'%Y-%m-%d%H:%m',以及Chart::Gnuplot选项timeaxis=>x,它可以完美地工作!我已经尝试了CSV导出,用OpenOffice.org Calc绘制它。我不需要实时绘制,但我必须定期生成几个图形,每天至少一次,因此,我希望避免手动操作。DateTime::Format::DBI工作得非常好,它将委托给正确的DateTime::Format::*模块我不知道Chart::Clicker。但是显示人性化日期的问题仍然存在。Axis::DateTime会根据范围自动设置日期格式。如果您不喜欢它的选择,您可以使用DateTime的strftime可以接受的任何格式字符串调用它的format方法,它将使用它。您可以通过ticks或tick_值方法控制要显示的记号的数量和/或位置
来自Chart::Clicker::Axis.Chart::Clicker似乎很棒,但不幸的是,我在Win32上使用的是ActivePerl 5.10,而Chart::Clicker似乎无法作为PPM包使用。