11

値 (整数) を日付にマッピングするデータベース (SQLite) からのデータがあります。日付は、次の形式の文字列です: YYYY-MM-DD hh:mm. 日付は均一に分散されていません。X日付をオンにし、値をオンにして折れ線グラフを描きたいと思いますY。Perl でこれを行う最も簡単な方法は何ですか?

DBIx::Chartを試しましたが、日付を認識させることができませんでした。GD::Graphも試しましたが、ドキュメントにあるように:

GD::Graph は数値の x 軸を本来あるべき方法でサポートしていません。X 軸のデータは等間隔にする必要があります

4

8 に答える 8

11

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

時間を Unix タイムスタンプに変換する必要がありますが、それは DWIM です。

于 2009-10-21T19:47:58.210 に答える
8

Chart::Gnuplotを使用してgnuplotを駆動できます。

または、SVG が許容可能な出力形式である場合は、SVG::TT::Graphがあります。

于 2009-10-21T13:09:20.887 に答える
3

これは私にとってはうまくいきました:

my $ctx = $chart->get_context('default');
$ctx->domain_axis(
    Chart::Clicker::Axis::DateTime->new(
        position        => 'bottom',
        orientation     => 'horizontal',
        ticks           => 5 ,
        format          => "%Y-%m-%d"
    )
);
于 2011-02-25T20:38:21.457 に答える
3

DBIx::Chart を試しましたが、日付を認識させることができませんでした。

日付を Unix-Timestamps に変換して X 日付として使用しようとしましたか?

于 2009-10-21T12:44:04.957 に答える
2

Perl でこれを行う最も簡単な方法は、Perl を使用して gnuplot プロセスを実行することです。を使用するset timefmt x "%Y-%m-%d"と、使用している形式でデータが自動的に解析されます。Gnuplot は、さまざまな出力形式もサポートしています。

于 2009-10-21T12:46:49.580 に答える
1

日付を整数に正規化することをお勧めします。もちろん、力ずくの方法ではエポック秒を使用しますが、グラフでは見栄えがよくない可能性があるため、適切な範囲への線形変換によって正規化します (必要に応じて方法の詳細を提供できます)。

于 2009-10-21T12:47:23.657 に答える
1

再帰クエリがサポートされていないため、以下は SQLLite では機能しませんが、Oracle では機能します。

次のようなサブクエリを使用して、Oracle dB の連続時系列を作成できます。

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

次に、次のように LEFT JOIN を使用して、その時系列をチャート データにリンクします。

    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 時間ごとに日付形式パラメーターをすべて一緒に省略できます。

範囲を変更するには、CONNECT BY LEVEL の値を、指定した解像度でプロットする必要がある時系列ポイントの数に設定するだけです。

**注: DBIx::Chart は、すべてのデータポイント値がゼロ (つまり、未定義) の場合にバーフします。申し訳ありません。

于 2013-02-01T21:26:15.540 に答える
1

グラフをリアルタイムで生成する必要がありますか、それとも 1 回限りのレポート用ですか? 後者の場合は、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";

以前、 Asymptoteを使用してこのようなことをしました。素晴らしいパッケージですが、使いにくいです。

于 2009-10-21T20:20:06.217 に答える