문제

데이터베이스 (SQLITE)의 데이터가 있는데, 값 (정수)을 날짜에 매핑합니다. 날짜는이 형식의 문자열입니다. YYYY-MM-DD hh:mm. 날짜는 균일하게 배포되지 않습니다. 나는 날짜와 함께 라인 그래프를 그려고 싶어 X 그리고 가치 Y. Perl 에서이 작업을 수행하는 가장 쉬운 방법은 무엇입니까?

나는 시도했다 dbix :: 차트 그러나 나는 그것이 내 날짜를 인식 할 수 없었다. 나는 또한 시도했다 GD :: 그래프, 그러나 문서가 말한 것처럼 :

GD :: 그래프는 수치 X 축을 지원하지 않습니다. X 축에 대한 데이터는 동일하게 간격을 두어야합니다

도움이 되었습니까?

해결책

넌 운전할 수있어 gnuplot 사용 차트 :: gnuplot.

또는 SVG가 허용 가능한 출력 형식 인 경우 svg :: tt :: 그래프.

다른 팁

차트를 사용할 수 있습니다 :: Clicker 's 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 타임 스탬프로 변환해야하지만 Dwims.

DBIX :: 차트를 시도했지만 날짜를 인식 할 수 없었습니다.

날짜를 Unix-Timestamps로 번역하여 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은 또한 다양한 출력 형식을 지원합니다.

날짜를 정수로 정상화하는 것이 좋습니다. 무차별 인력 방법은 물론 에포크 초를 사용하는 것이지만 그래프에서는 너무 멋지게 보이지 않을 수도 있으므로 선형 변환으로 일부 적절한 범위로 정상화하십시오 (원하는 경우 어떻게 세부 사항을 제공 할 수 있습니다).

그래프를 실시간으로 생성해야합니까, 아니면 일회성 보고서를위한 것입니까? 후자의 경우 DateTime 모듈을 사용하여 Excel 값을 생성하고 Excel (또는 Open-Source Contricpart)에 그래프로 표시 할 수 있습니다.

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

그런 다음 이와 같이 왼쪽 결합을 사용하여 해당 시계열이 차트 데이터에 연결하십시오.

    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 :: 차트와 함께 작동합니다. 해상도를 시간으로 변경하려면 'mi'를 'HH24'로 변경하거나 24 시간마다 날짜 형식 매개 변수를 모두 생략 할 수 있습니다.

범위를 변경하려면 단순히 지정된 해상도에서 플롯 해야하는 시계열 포인트 수로 레벨 값으로 연결을 설정합니다.

** 참고 : dbix :: 차트는 모든 데이터 포인트 값이 0 인 경우 (예 : 정의되지 않은) BARF가됩니다. 당신을 도와 줄 수 없습니다. 죄송합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top