كيف يمكنني رسم سلسلة الرسم البياني الوقت مع بيرل؟
سؤال
ولدي بعض البيانات من قاعدة بيانات (سكليتي)، ورسم خرائط قيمة (عدد صحيح) إلى تاريخ. والتاريخ هو سلسلة مع هذا التنسيق: YYYY-MM-DD hh:mm
. لم يتم توزيعها بشكل موحد التواريخ. أريد لا رسم خط الرسم البياني مع التواريخ X
والقيم على Y
. ما هو أسهل طريقة للقيام بذلك مع بيرل؟
دبيكس :: الهيكل ولكن لم أستطع جعلها تعترف تواريخي . كما أنني حاولت GD :: الرسم البياني ، ولكن كما تقول الوثائق:
<اقتباس فقرة>وGD :: الرسم البياني لا يدعم س العددي محور بالطريقة التي ينبغي. البيانات لX محاور يجب أن تكون متباعدة بالتساوي
اقتباس فقرة>المحلول
ويمكنك دفع gnuplot باستخدام <لأ href = "http://search.cpan.org/perldoc / الرسم البياني :: Gnuplot "يختلط =" noreferrer "> الرسم البياني :: Gnuplot .
وبدلا من ذلك، إذا SVG هو تنسيق الإخراج مقبول، هناك SVG :: TT :: الرسم البياني .
نصائح أخرى
ويمكنك استخدام الرسم البياني :: الفرس ومحور :: التاريخ والوقت:
#!/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');
لديك لتحويل مرات الخاص بك إلى الطوابع يونيكس، ولكنها DWIMs.
وحاولت دبيكس :: مخطط لكنني لا يمكن أن تجعل من الاعتراف تواريخي.
اقتباس فقرة>هل حاولت أن تترجم التواريخ ليونكس الطوابع واستخدامها مواعيد 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"
)
);
وأسهل طريقة وجدتها للقيام بذلك مع بيرل هي استخدام بيرل لتشغيل عملية gnuplot. يمكنك استخدام set timefmt x "%Y-%m-%d"
وسوف تلقائيا تحليل البيانات في شكل لديك. Gnuplot كما يدعم مجموعة متنوعة من تنسيقات الإخراج.
وأوصي تطبيع التواريخ والأعداد الصحيحة. ان طريقة القوة الغاشمة يكون بالطبع باستخدام ثواني الحقبة، ولكن هذا قد لا تبدو لطيفة جدا على الرسم البياني، لذلك تطبيع من قبل الخطية تتحول إلى بعض طائفة كريمة (لا أستطيع تقديم تفاصيل عن الكيفية إذا رغبت في ذلك).
هل تحتاج إلى الرسم البياني الخاص بك إلى أن تتولد في الوقت الحقيقي، أو هو لتقرير لمرة واحدة؟ إذا كان هذا الأخير، ثم يمكنك استخدام وحدات التاريخ والوقت لإنشاء قيم اكسل والرسم البياني لهم في 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 كما لا يتم اعتماد الاستعلامات العودية، ولكنها ستعمل في أوراكل.
ويمكنك إنشاء سلسلة زمنية متواصلة لأوراكل 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 وستعمل ** مع دبيكس :: الرسم البياني. لتغيير قرار لساعات التغيير "MI 'إلى' HH24، أو كل 24 ساعة يمكنك حذف المعلمة تنسيق التاريخ معا.
لتغيير نطاق ببساطة تعيين CONNECT BY قيمة LEVEL إلى عدد من النقاط السلاسل الزمنية تحتاج إلى رسم في القرار الخاص المحدد.
و** ملاحظة: سوف دبيكس :: مخطط شبكة الزعيم إذا كان كل القيم DATAPOINT صفر (أي غير محددة). لا يمكن أن تساعدك هناك، آسف.