ActivePerlでグラフを作る(GIFgraphの話)

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)


目次

1 実行に必要なもの、設定

2. 簡単な例
2.1 軸付グラフのコーディング
2.2 円グラフのコーディング
2.3 グラフのイメージ
2.4 CGIで使う場合

3 指定できる属性
3.1 色
3.2 フォント
3.3 線の種類
3.4 マーカー

4. ちょっと複雑なグラフ
4.1 2種類以上データ
4.2 2系列のデータ
4.3 凡例をつける

参考資料


1. 実行に必要なもの、設定

GIFgraphモジュールとはMartien Verbruggen氏が開発した、Perlからグラフを作成するためのモジュールです。

名前が示すとおり、GIF形式の画像としてグラフを作成することができます。

IFgraphを使ってグラフを作成するためには以下のものが必要になります。

パッケージ名 説    明
GD GDモジュール
GIF-Graph GIFgraphモジュール       

GIFgraphをインストールするとGIFGraph::Colourモジュールも同じにインストールされます。

2. グラフの簡単な例

GIFgraphモジュールでは作成できるグラフを軸のあるなしで2つの種類に分けています。

 

2.1 軸付グラフのコーディング

軸付グラフは以下のようにすると作成することができます。

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

 

2.2 円グラフのコーディング

円グラフは以下のようにすると作成することができます。

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

 

2.3 グラフのイメージ

実際には以下のようなファイルができます。

lines.gif

bars.gif

points.gif

linespoints.gif

area.gif

pie.gif

2.4 CGIで使う場合

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

ブラウザでの表示イメージ

 

3 指定できる属性

3.1 色

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

3.2 フォント

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





 

3.3 線種

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

 

3.4 マーカー

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

4 複雑なグラフ

4.1 2種類以上のデータ

軸付グラフでは、データ配列にデータを追加することにより、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 );






 

4.2 2系列のデータ

軸付グラフでは、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 );





4.3 凡例をつける

軸付グラフでは、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 );

参考資料

この文書をつくるのにあたり、以下のサイトのお世話になりました.


ホーム Perlの小技

ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。