インフルエンザ患者数のグラフを作る

(1/1)
PHP と JpGraph で人口ピラミッドを表示する」では棒グラフを扱ったが、同様に PHP と JpGraph を用い、急増している新型インフルエンザ患者数を折れ線グラフであらわすプログラムを作ってみる。
インフルエンザ患者数は日々変化しているので、公的機関が発表している患者数データを、外部ファイルから取り込むようにした。
space
なお、このプログラムのアウトプット(グラフ)は、「新型インフルエンザ関連情報」で利用している。毎週テキストファイル(CSV ファイル)にデータを追加するだけでグラフが更新されるようになっている。

サンプル・プログラム

プログラムを実行する

ダウンロード(PHP4/5共用)

準備

PHP と JpGraph で人口ピラミッドを表示する」を参考に、JpGraph と日本語フォントを準備する。

患者データの入手

折れ線グラフに描くデータは、国立感染症研究所 感染症情報センターの「疾病毎定点あたり報告数」を利用する。
CSV 形式データとして提供されているので、Excel などで読み込み、インフルエンザの部分だけを取り出し、下記のような CSV データとして編集・加工する(最初のカラムに西暦年号数字をセットする)。
1999,8.86,20.3,33.56,33.86,27.16,22.67,20.95,20.96,19.2,14.95,11.71,5.47,,1.5,
1.22,0.9,0.59,0.26,0.27,0.17,0.13,0.1,0.08,0.06,0.06,0.05,0.05,0.05,0.04,0.04,
0.03,0.02,0.01,0.02,0.03,0.03,0.02,0.02,0.03,0.04,0.05,0.07,0.08,0.09,0.1,0.
17,0.21,0.35,0.74,1.53,3.22,3.21,
2000,6.15,10.24,23.32,34.26,36.16,24.7,13.8,8.36,4.62,2.41,1.2,0.51,0.26,0.13,
0.1,0.07,0.05,0.03,0.04,0.03,0.03,0.03,0.03,0.02,0.02,0.02,0.02,0.01,0.01,
0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.02,0.02,0.02,0.03,0.03,0.04,
0.05,0.06,0.08,0.15,0.23,0.27,0.32,0.36,
データは "influeza.txt" というファイル名で保管しておく。

解説:初期化処理

患者数の増減は折れ線グラフで描くが、読みやすいように、年によってグラフの色や太さを変えている。
色は RGB 各 8bit で配列変数 $PlotColor に、太さは配列変数 $PlotWeight にあらかじめ代入しておく。

0024: //折れ線グラフの色(年ごとに少しずつ色を変える)
0025: $PlotColor = array(
0026: 1999 => '#888888',
0027: 2000 => '#CC8888',
0028: 2001 => '#FF8888',
0029: 2002 => '#88CC44',
0030: 2003 => '#CCCC44',
0031: 2004 => '#FFCC44',
0032: 2005 => '#884488',
0033: 2006 => '#CC4488',
0034: 2007 => '#FF4488',
0035: 2008 => '#8844CC',
0036: 2009 => '#880000',
0037: 2010 => '#FF0000'
0038: );
0039: 
0040: //折れ線グラフの太さ(直近のグラフだけ太線にする)
0041: $PlotWeight = array(
0042: 1999 => 1,
0043: 2000 => 1,
0044: 2001 => 1,
0045: 2002 => 1,
0046: 2003 => 1,
0047: 2004 => 1,
0048: 2005 => 1,
0049: 2006 => 1,
0050: 2007 => 1,
0051: 2008 => 1,
0052: 2009 => 3,
0053: 2010 => 3
0054: );

解説:データを配列に読み込む

CSV データファイル "influenza.txt" を読み込むための関数が readData である。
space
この仕組みは「PHP で CSV ファイルを読み込む」で解説した通りである。

0057: /**
0058:  * データを配列に読み込む
0059:  * @param string $fname データファイル名
0060:  * @param array  $rec   読み込む配列
0061:  * @return bool TRUE/FALSE
0062: */
0063: function readData($fname, &$rec) {
0064:     $infp = fopen($fname, 'r');
0065:     if ($infp == FALSE)     return FALSE;
0066: 
0067:     while (($arr = fgetcsv($infp, 1000, ',')) != FALSE) {
0068:         foreach ($arr as $key=>$val) {
0069:             if ($key == 0) {
0070:                 $year = $val;
0071:                 $week = 1;
0072:             } else {
0073:                 $rec[$year][$week] = $val;
0074:                 $week++;
0075:             }
0076:         }
0077:     }
0078:     return fclose($infp);
0079: }

解説:グラフを描く

グラフの描画は JpGraph の機能を利用している。
space
まず、1 年分のデータを配列 $data_y に代入し、折れ線グラフを 1 本描く。
この作業を年数分繰り返すだけである。

0107: //折れ線グラフ
0108: foreach ($rec as $year=>$data) {
0109:     foreach ($data as $week=>$val)  $data_y[$week] = $rec[$year][$week] ;
0110: 
0111:     //折れ線グラフ作成
0112:     $PlotData[$year] = new LinePlot($data_y);
0113:     $PlotData[$year]->SetColor($PlotColor[$year]);        //色
0114:     $PlotData[$year]->SetWeight($PlotWeight[$year]);  //太さ
0115:     $PlotData[$year]->SetLegend($year . '');          //凡例
0116:     // グラフを結合する
0117:     $graph->Add($PlotData[$year]);
0118: }

参考書籍

参考サイト

(この項おわり)
header