Perlで時系列グラフをプロットするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1600551

  •  05-07-2019
  •  | 
  •  

質問

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

DBIx :: Chart を試しましたが、日付を認識させることができませんでした。私も GD :: Graph を試しましたが、ドキュメントには次のように書かれています:

  

GD :: Graphは数値xをサポートしていません   軸を本来の方法で。 Xのデータ   軸は等間隔でなければなりません

役に立ちましたか?

解決

gnuplot を運転できます。 / Chart :: Gnuplot "rel =" noreferrer "> Chart :: Gnuplot 。

また、SVGが許容可能な出力形式である場合、 SVG :: TTがあります::グラフ

他のヒント

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です。

  

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

日付をUnixタイムスタンプに変換してX日付として使用しようとしましたか?

これは私のためのトリックでした:

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

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

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

グラフをリアルタイムで生成する必要がありますか、それとも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";

以前、漸近を使用してこのようなことをしました。これは信じられないほどのパッケージですが、使いやすいものではありません。

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

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

(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はバーフします。お手伝いできません、申し訳ありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top