by Hippo2000(1999/2/25)
「Perlを使ってグラフを表示したい」 と思ったことありませんか?
CGIでもやっぱり文字だけでなく、グラフを表示したいという場合に簡単なGIFgraphの紹介をしてみようと思います。GIFgraphモジュールとはMartien Verbruggen氏が開発した、Perlからグラフを作成するためのモジュールです。
名前が示すとおり、GIF形式の画像としてグラフを作成することができます。
ただし現在、GIFgraphでは日本語が表示できないようです。 (できるようだったら教えてくださいm<__>m)なおここでは、いつものように本当に簡単な例しか出していません。(やっぱり書く人間の能力と根気に依存しているので...)
参考資料(C:\Perl\html\lib\site\GIFgraph.html)をベースにしています。詳しくはそちらをご覧ください。
まだまだ色々な設定ができますので、御注意!
新しいGDモジュール(1.2以降)ではGIF形式の出力がはずされ、PNG形式がサポートされるようになりました。
そのためGIFgraphモジュールはそのままでは動きません。(gifメソッドを使用しているため)
GIFgraphをお使いの方はPNG形式で出力するように変更されるか、従来のGDモジュールを利用するようにしてください。(99/10/9)もりさんから指摘を受けましたが、ActivePerlのサイトにはPNGgraphというものが公開されており、gifとある部分をpngに変更することで同じように使うことができるようです。しかしCPANには他にもChart-PNGgraph、GDgraphといったものもあり、どれが今後も残っていくのかよくわからない状態です。(2000/1/5)
GIFgraphモジュールとはMartien Verbruggen氏が開発した、Perlからグラフを作成するためのモジュールです。
名前が示すとおり、GIF形式の画像としてグラフを作成することができます。
IFgraphを使ってグラフを作成するためには以下のものが必要になります。
| パッケージ名 | 説 明 |
|---|---|
| GD | GDモジュール |
| GIF-Graph | GIFgraphモジュール |
GIFgraphをインストールするとGIFGraph::Colourモジュールも同じにインストールされます。
GIFgraphモジュールでは作成できるグラフを軸のあるなしで2つの種類に分けています。
| パッケージ名 | 説 明 |
|---|---|
| GIFgraph:lines | 折線グラフ |
| GIFgraph:bars | 棒グラフ |
| GIFgraph:points | 点グラフ |
| GIFgraph:linespoints | 折線と点の組み合わせによるグラフ |
| GIFgraph:area | 折線の下の領域によりデータをあらわすグラフ |
| GIF:mixed | 上記のものを組み合わせたグラフ |
| パッケージ名 | 説 明 |
|---|---|
| GIFgraph:pie | 円グラフ |
軸付グラフは以下のようにすると作成することができます。
use GIFgraph::lines; use GIFgraph::bars; use GIFgraph::points; use GIFgraph::linespoints; use GIFgraph::area; @data = ( ["98/04","98/05","98/06","98/07","98/08","98/09", "98/10","98/11","98/12","99/01","99/02","99/03" ], [ 18, 20, 15, 16, 13, 15, 21, 22, undef, 18, 16, undef ] ); #折線グラフ $my_graph = new GIFgraph::lines( ); $my_graph->set( bgclr => white, transparent => 0, dclrs => [ black ], x_label => 'Month', y_label => 'Total', title => 'GRAPH Test(lines)', y_min_value => 0, y_max_value => 30, y_tick_number => 6, y_label_skip => 1 ); $my_graph->plot_to_gif ( "c:/user/gifgraph/lines.gif", \@data ); #棒グラフ $my_graph = new GIFgraph::bars( ); $my_graph->set( bgclr => white, transparent => 0, dclrs => [ red ], x_label => 'Month', y_label => 'Total', title => 'GRAPH Test(bars)', y_min_value => 0, y_max_value => 30, y_tick_number => 6, y_label_skip => 1 ); $my_graph->plot_to_gif ( "c:/user/gifgraph/bars.gif", \@data ); #点グラフ $my_graph = new GIFgraph::points( ); $my_graph->set( bgclr => white, transparent => 0, dclrs => [ blue ], x_label => 'Month', y_label => 'Total', title => 'GRAPH Test(points)', y_min_value => 0, y_max_value => 30, y_tick_number => 6, y_label_skip => 1 ); $my_graph->plot_to_gif ( "c:/user/gifgraph/points.gif", \@data ); #折線と点の組み合わせによるグラフ $my_graph = new GIFgraph::linespoints( ); $my_graph->set( bgclr => white, transparent => 0, dclrs => [ green ], x_label => 'Month', y_label => 'Total', title => 'GRAPH Test(linepoints)', y_min_value => 0, y_max_value => 30, y_tick_number => 6, y_label_skip => 1 ); $my_graph->plot_to_gif ( "c:/user/gifgraph/linepoints.gif", \@data ); #折線の下の領域によりデータをあらわすグラフ $my_graph = new GIFgraph::area( ); $my_graph->set( bgclr => white, transparent => 0, dclrs => [ cyan ], x_label => 'Month', y_label => 'Total', title => 'GRAPH Test(area)', y_min_value => 0, y_max_value => 30, y_tick_number => 6, y_label_skip => 1 ); $my_graph->plot_to_gif ( "c:/user/gifgraph/area.gif", \@data );
円グラフは以下のようにすると作成することができます。
use GIFgraph::pie; @data = ( ["98/04","98/05","98/06","98/07","98/08","98/09", "98/10","98/11","98/12","99/01","99/02","99/03" ], [ 18, 20, 15, 16, 13, 15, 21, 22, 10, 18, 16, 11 ], ); $my_graph = new GIFgraph::pie( ); $my_graph->set( bgclr => white, transparent => 0, start_angle => -180, dclrs => [ cyan, lred, lyellow, lgreen, orange, marine ], title => 'GRAPH Test(pie)', ); $my_graph->plot_to_gif ( "c:/user/gifgraph/pie.gif", \@data );
実際には以下のようなファイルができます。
![]() lines.gif |
![]() bars.gif |
points.gif |
linespoints.gif |
![]() area.gif |
![]() pie.gif |
GIF-Graphモジュールは当然、CGIでも使うことができます。
plot_to_gifメソッドではなく、plotメソッドを使うとGIFデータを返します。
先ほどの円グラフをCGIでブラウザに表示させるためには以下のようにします。
use GIFgraph::pie; @data = ( ["98/04","98/05","98/06","98/07","98/08","98/09", "98/10","98/11","98/12","99/01","99/02","99/03" ], [ 18, 20, 15, 16, 13, 15, 21, 22, 10, 18, 16, 11 ], ); $my_graph = new GIFgraph::pie( ); $my_graph->set( bgclr => white, transparent => 0, start_angle => -180, dclrs => [ cyan, lred, lyellow, lgreen, orange, marine ], title => 'GRAPH Test(pie)', ); #ここ以降を追加 print <<EOF; #ヘッダの宣言(間違っていたので修正 3/26) Content-Type: image/gif EOF binmode(STDOUT); #GIFデータなのでbinmode print $my_graph->plot(\@data);
ブラウザでの表示イメージ

GIFgraphではdclrsやbgclrなどのプロパティで、GIFgraph::colourで定義されている以下のように色を指定することができます。
このほかRGB値などにより指定することも可能です。詳しくはGIFgraph::clolourのドキュメントをご覧ください。
use GIFgraph::pie;
@data = (
[qw(white lgray gray dgray black lblue blue
dblue gold lyellow yellow dyellow lgreen green
dgreen lred red dred lpurple purple dpurple
lorange orange pink dpink marine cyan lbrown
dbrown)],
[20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 20, 20, 20]);
$my_graph = new GIFgraph::pie( 500, 400 );
$my_graph->set(
bgclr => white,
transparent => 0,
dclrs => [
white, lgray, gray, dgray, black, lblue, blue,
dblue, gold, lyellow, yellow, dyellow, lgreen, green,
dgreen, lred, red, dred, lpurple, purple, dpurple,
lorange, orange, pink, dpink, marine, cyan, lbrown,
dbrown ],
start_angle => -180,
title => 'GRAPH Test(color sample)',
);
$my_graph->plot_to_gif ( "c:/user/gifgraph/color.gif", \@data );
|
![]() |
||
GIFgraphではset_title_fontプロパティなどに、GDモジュールで定義されているフォントを使用することができます。
その場合にはuse GDする必要があります。
use GD;
use GIFgraph::lines;
@data = (
["98/04","98/05","98/06","98/07","98/08","98/09",
"98/10","98/11","98/12","99/01","99/02","99/03" ],
[ 18, 20, 15, 16, 13, 15,
21, 22, undef, 18, 16, undef ]
);
$myGraph = new GIFgraph::lines( );
$myGraph->set_title_font(gdTinyFont);
$myGraph->set( title => 'TinyFont' );
$myGraph->plot_to_gif ( "c:/user/gifgraph/tiny.gif", \@data );
$myGraph = new GIFgraph::lines( );
$myGraph->set_title_font(gdSmallFont);
$myGraph->set( title => 'SmallFont' );
$myGraph->plot_to_gif ( "c:/user/gifgraph/small.gif", \@data );
$myGraph = new GIFgraph::lines( );
$myGraph->set_title_font(gdMediumBoldFont);
$myGraph->set( title => 'MediumBoldFont' );
$myGraph->plot_to_gif ( "c:/user/gifgraph/mediumbold.gif", \@data );
$myGraph = new GIFgraph::lines( );
$myGraph->set_title_font(gdLargeFont);
$myGraph->set( title => 'LargeFont' );
$myGraph->plot_to_gif ( "c:/user/gifgraph/large.gif", \@data );
$myGraph = new GIFgraph::lines( );
$myGraph->set_title_font(gdGiantFont);
$myGraph->set( title => 'GiantFont' );
$myGraph->plot_to_gif ( "c:/user/gifgraph/giant.gif", \@data );
|
![]() ![]() ![]() ![]() ![]() |
||
linesやlinespointsグラフでは線の種類を以下のように4種類、指定することができます。
use GIFgraph::lines;
@data = (
["98/04","98/05","98/06","98/07","98/08","98/09",
"98/10","98/11","98/12","99/01","99/02","99/03" ],
[ 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10] ,
[ 15, 15, 15, 15, 15, 15,
15, 15, 15, 15, 15, 15],
[ 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20],
[ 25, 25, 25, 25, 25, 25,
25, 25, 25, 25, 25, 25]
);
$my_graph = new GIFgraph::lines( );
$my_graph->set(
bgclr => white,
transparent => 0,
line_types => [ 1, 2, 3, 4],
line_width => 3,
dclrs => [ blue, red, green, orange ],
x_label => 'Month',
y_label => 'Total',
title => 'GRAPH Test(lines)',
y_min_value => 0,
y_max_value => 30,
y_tick_number => 6,
y_label_skip => 1
);
$my_graph->plot_to_gif ( "c:/user/gifgraph/lines2.gif", \@data );
|
![]() |
||
pointsやlinespointsグラフでは点の種類を以下のように8種類、指定することができます。
use GIFgraph::points;
@data = (
["98/04","98/05","98/06","98/07","98/08","98/09",
"98/10","98/11","98/12","99/01","99/02","99/03" ],
[ 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8],
[ 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10] ,
[ 12, 12, 12, 12, 12, 12,
12, 12, 12, 12, 12, 12],
[ 15, 15, 15, 15, 15, 15,
15, 15, 15, 15, 15, 15],
[ 17, 17, 17, 17, 17, 17,
17, 17, 17, 17, 17, 17],
[ 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20],
[ 25, 25, 25, 25, 25, 25,
25, 25, 25, 25, 25, 25],
[ 27, 27, 27, 27, 27, 27,
27, 27, 27, 27, 27, 27]
);
$my_graph = new GIFgraph::points( );
$my_graph->set(
bgclr => white,
transparent => 0,
markers => [1, 2, 3, 4, 5, 6, 7, 8],
dclrs => [ blue, red, green, orange ],
x_label => 'Month',
y_label => 'Total',
title => 'GRAPH Test(linepoints)',
y_min_value => 0,
y_max_value => 30,
y_tick_number => 6,
y_label_skip => 1
);
$my_graph->plot_to_gif ( "c:/user/gifgraph/marker.gif", \@data );
|
![]() |
||
軸付グラフでは、データ配列にデータを追加することにより、2種類以上のデータを1つのグラフで表すことができます。
use GIFgraph::lines;
use GIFgraph::bars;
use GIFgraph::points;
use GIFgraph::linespoints;
use GIFgraph::area;
use GIFgraph::mixed;
@data = (
["98/04","98/05","98/06","98/07","98/08","98/09",
"98/10","98/11","98/12","99/01","99/02","99/03" ],
[ 48, 50, 45, 36, 43, 35,
41, 42, 50, 48, 36, undef ],
[ 18, 20, 15, 16, 13, 15,
21, 22, undef, 18, 16, undef ]
);
$my_graph = new GIFgraph::lines( );
$my_graph->set(
bgclr => white,
transparent => 0,
line_types => [ 1, 2],
line_width => 3,
dclrs => [ blue, red ],
x_label => 'Month',
y_label => 'Total',
title => 'GRAPH Test(lines)',
y_min_value => 0,
y_max_value => 60,
y_tick_number => 6,
y_label_skip => 1
);
$my_graph->plot_to_gif ( "c:/user/gifgraph/lines2.gif", \@data );
$my_graph = new GIFgraph::bars( );
$my_graph->set(
bgclr => white,
transparent => 0,
dclrs => [ blue, red],
x_label => 'Month',
y_label => 'Total',
title => 'GRAPH Test(bars)',
y_min_value => 0,
y_max_value => 60,
y_tick_number => 6,
y_label_skip => 1
);
$my_graph->plot_to_gif ( "c:/user/gifgraph/bars2.gif", \@data );
$my_graph = new GIFgraph::points( );
$my_graph->set(
bgclr => white,
transparent => 0,
markers => [1, 2],
dclrs => [ blue, red ],
x_label => 'Month',
y_label => 'Total',
title => 'GRAPH Test(points)',
y_min_value => 0,
y_max_value => 60,
y_tick_number => 6,
y_label_skip => 1
);
$my_graph->plot_to_gif ( "c:/user/gifgraph/points2.gif", \@data );
$my_graph = new GIFgraph::linespoints( );
$my_graph->set(
bgclr => white,
transparent => 0,
markers => [3, 4],
line_types => [3, 4],
line_width => 2,
dclrs => [ blue, red],
x_label => 'Month',
y_label => 'Total',
title => 'GRAPH Test(linepoints)',
y_min_value => 0,
y_max_value => 60,
y_tick_number => 6,
y_label_skip => 1
);
$my_graph->plot_to_gif ( "c:/user/gifgraph/linepoints2.gif", \@data );
$my_graph = new GIFgraph::area( );
$my_graph->set(
bgclr => white,
transparent => 0,
dclrs => [ blue, red ],
x_label => 'Month',
y_label => 'Total',
title => 'GRAPH Test(area)',
y_min_value => 0,
y_max_value => 60,
y_tick_number => 6,
y_label_skip => 1
);
$my_graph->plot_to_gif ( "c:/user/gifgraph/area2.gif", \@data );
$my_graph = new GIFgraph::mixed( );
$my_graph->set(
bgclr => white,
transparent => 0,
types => [ 'lines', 'area' ],
dclrs => [ blue, red, green, orange, lyellow ],
x_label => 'Month',
y_label => 'Total',
title => 'GRAPH Test(mixed)',
y_min_value => 0,
y_max_value => 60,
y_tick_number => 6,
y_label_skip => 1
);
$my_graph->plot_to_gif ( "c:/user/gifgraph/mixed2.gif", \@data );
|
![]() ![]() ![]() ![]() ![]() ![]() |
||
軸付グラフでは、two_axesプロパティを1とし、データを追加するだけで、2つの単位が違うデータを1つのグラフで表すことができます。
単位が違う場合には、2種類のデータしか表示できません。
use GIFgraph::lines;
use GIFgraph::bars;
use GIFgraph::points;
use GIFgraph::linespoints;
use GIFgraph::area;
use GIFgraph::mixed;
@data = (
["98/04","98/05","98/06","98/07","98/08","98/09",
"98/10","98/11","98/12","99/01","99/02","99/03" ],
[ 48, 50, 45, 36, 43, 35,
41, 42, 50, 48, 36, undef ],
[ 180, 200, 150, 160, 130, 150,
210, 220, 280, 290, 160, undef ]
);
$my_graph = new GIFgraph::lines( );
$my_graph->set(
bgclr => white,
transparent => 0,
line_types => [ 1, 2],
line_width => 3,
dclrs => [ blue, red ],
x_label => 'Month',
y_label => 'Total',
title => 'GRAPH Test(lines)',
two_axes => 1,
y1_min_value => 0,
y1_max_value => 60,
y2_min_value => 0,
y2_max_value => 300,
y_tick_number => 6,
y_label_skip => 1
);
$my_graph->plot_to_gif ( "c:/user/gifgraph/lines3.gif", \@data );
$my_graph = new GIFgraph::bars( );
$my_graph->set(
bgclr => white,
transparent => 0,
dclrs => [ blue, red],
x_label => 'Month',
y_label => 'Total',
title => 'GRAPH Test(bars)',
two_axes => 1,
y1_min_value => 0,
y1_max_value => 60,
y2_min_value => 0,
y2_max_value => 300,
y_tick_number => 6,
y_label_skip => 1
);
$my_graph->plot_to_gif ( "c:/user/gifgraph/bars3.gif", \@data );
$my_graph = new GIFgraph::points( );
$my_graph->set(
bgclr => white,
transparent => 0,
markers => [1, 2],
dclrs => [ blue, red ],
x_label => 'Month',
y_label => 'Total',
title => 'GRAPH Test(points)',
two_axes => 1,
y1_min_value => 0,
y1_max_value => 60,
y2_min_value => 0,
y2_max_value => 300,
y_tick_number => 6,
y_label_skip => 1
);
$my_graph->plot_to_gif ( "c:/user/gifgraph/points3.gif", \@data );
$my_graph = new GIFgraph::linespoints( );
$my_graph->set(
bgclr => white,
transparent => 0,
markers => [3, 4],
line_types => [3, 4],
line_width => 2,
dclrs => [ blue, red],
x_label => 'Month',
y_label => 'Total',
title => 'GRAPH Test(linepoints)',
two_axes => 1,
y1_min_value => 0,
y1_max_value => 60,
y2_min_value => 0,
y2_max_value => 300,
y_tick_number => 6,
y_label_skip => 1
);
$my_graph->plot_to_gif ( "c:/user/gifgraph/linepoints3.gif", \@data );
$my_graph = new GIFgraph::area( );
$my_graph->set(
bgclr => white,
transparent => 0,
dclrs => [ blue, red ],
x_label => 'Month',
y_label => 'Total',
title => 'GRAPH Test(area)',
two_axes => 1,
y1_min_value => 0,
y1_max_value => 60,
y2_min_value => 0,
y2_max_value => 300,
y_tick_number => 6,
y_label_skip => 1
);
$my_graph->plot_to_gif ( "c:/user/gifgraph/area3.gif", \@data );
$my_graph = new GIFgraph::mixed( );
$my_graph->set(
bgclr => white,
transparent => 0,
types => [ 'lines', 'area' ],
dclrs => [ blue, red, green, orange, lyellow ],
x_label => 'Month',
y_label => 'Total',
title => 'GRAPH Test(mixed)',
two_axes => 1,
y1_min_value => 0,
y1_max_value => 60,
y2_min_value => 000,
y2_max_value => 300,
y_tick_number => 6,
y_label_skip => 1
);
$my_graph->plot_to_gif ( "c:/user/gifgraph/mixed3.gif", \@data );
|
![]() ![]() ![]() ![]() ![]() ![]() |
||
軸付グラフでは、set_legendメソッドにより凡例をつけることができます。
use GIFgraph::mixed;
@data = (
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
[ 180, 200, 150, 160, 130, 150,
210, 220, 280, 290, 160, 280 ],
[ 48, 50, 45, 36, 43, 35,
41, 42, 50, 48, 36, 20 ],
);
$my_graph = new GIFgraph::mixed( );
$my_graph->set(
bgclr => white,
transparent => 0,
types => [ 'bars', 'lines' ],
dclrs => [ blue, red, green, orange, lyellow ],
x_label => 'Month',
y_label => 'Total',
title => 'GRAPH Test(legend)',
two_axes => 1,
y1_min_value => 000,
y1_max_value => 300,
y2_min_value => 0,
y2_max_value => 60,
y_tick_number => 6,
y_label_skip => 1
);
$my_graph->set_legend(('bar-data', 'lines-data'));
$my_graph->plot_to_gif ( "c:/user/gifgraph/mixed4.gif", \@data );
|
![]() |
||
この文書をつくるのにあたり、以下のサイトのお世話になりました.
ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。