Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

Sparklineを使ってミニグラフを作る

Sparklineは、ずいぶん前にid:elfさんが言及されていたグラフ作成ライブラリです。

で、「別途取得したAmazonランキングの直近1週間分のデータをグラフにする」というスクリプトを書いてみました。データはSQLiteに格納してあり、テーブルamazon_rankingは2つのカラム

  • データ取得日時(dt。「年月日時分秒」形式)
  • ランキング情報(rank)

を持っています。Do You PHP?のEXPERIENCEにデモ環境を用意しましたので、気になる方はどうぞ。なお、データは毎時0分頃に更新されていますので、見るタイミングによってグラフが変わります。

<?php
require_once('/path/to/Sparkline_Line.php');

$dsn = 'sqlite:/path/to/ranking_data';
try {
    $db = new PDO($dsn);
    $db->setAttribute(PDO::ATTR_CASE, PDO::CASE_LOWER);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
    echo '    error code: ' . $e->getCode();
    exit;
}

$stmt = $db->prepare('SELECT * FROM amazon_ranking WHERE dt > ? ORDER BY dt ');$target_dt = date('YmdHis', time() - (60 * 60 * 24 * 7));
$stmt->bindParam(1, $target_dt);
try {
    $stmt->execute();
} catch (PDOException $e) {
    exit;
}

$sparkline = new Sparkline_Line();
$sparkline->SetDebugLevel(DEBUG_NONE);

$best = array();
$bes['idx'] = 0;
$bes['rank'] = -PHP_INT_MAX;
$worst = array();
$worst['idx'] = 0;
$worst['rank'] = 0;
$last = array();
$last['idx'] = 0;
$last['rank'] = 0;
$data = array();
$cnt = 0;

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    $current_rank = -$row['rank'];
    if ($best['rank'] < $current_rank) {
        $best['idx'] = $cnt;
        $best['rank'] = $current_rank;
    }
    if ($worst['rank'] > $current_rank) {
        $worst['idx'] = $cnt;
        $worst['rank'] = $current_rank;
    }
    $last['idx'] = $cnt;
    $last['rank'] = -$current_rank;
    $sparkline->SetData($cnt, $current_rank);
    $cnt++;
}

$sparkline->SetColorHtml('ltgreen', '#00CC00');
$sparkline->SetFeaturePoint($worst['idx'], $worst['rank'], 'red', 5, -$worst['rank'], TEXT_TOP, FONT_2);
$sparkline->SetFeaturePoint($best['idx'], $best['rank'], 'blue', 5, -$best['rank'], TEXT_TOP, FONT_2);
$sparkline->SetFeaturePoint($last['idx'], $last['rank'], 'ltgreen', 5);

$sparkline->SetLineSize(2);
$sparkline->RenderResampled(120, 20);

$sparkline->Output();

Blogパーツとか、ちょっとしたグラフ化をするには手頃なライブラリです。もう開発は止まっている(最新ニュースが2005年6月)ようですが、まあ、大がかりなものではないので、最悪ソースを追えば良いかな、と。

え?対象商品は当然。。。

PHPによるデザインパターン入門

PHPによるデザインパターン入門

ですよ。しかし、順調に下がってる。。。orz