perlでグラフを作成するサンプルを試してみた。

0

     

    perlでグラフを作成するサンプルを試してみた。
     

    http://www.gadgety.net/shin/tips/unix/perl-gd.html
    ここのページに色々書いてあるので参考にする。

    準備
     Jcodeをインストール
     GDをインストール

     

     perl -MCPAN -e shell

      install Jcode
      
      install GD
     
     yum install gd-devel
     

     perl -MCPAN -e 'install GD::Graph'

     

     

     

     

     

     

     

     

     

    実行
     ネットから拾ったサンプル


     graph.cgi
          1 #!/usr/bin/perl -w
          2 use strict;
          3 use Jcode;
          4 use GD::Graph::bars;
          5 my @labels  = qw( under 10s  20s  30s  40s  50s  60s  70s over );
          6 my @dataset = qw(   20   40   60   80   65   15   10   20    5 );
          7 my @data    = ( ¥@labels, ¥@dataset);
          8 my $graph = GD::Graph::bars->new( 400, 300 );
          9 $graph->set( title   => jcode("にこにこ村の人口")->utf8,
         10              y_label => jcode("人数")->utf8 );
         11 GD::Text->font_path( "./" );
         12 $graph->set_title_font( "GOTHIC_FONT", 14 );
         13 $graph->set_legend_font( "GOTHIC_FONT", 8 );
         14 $graph->set_x_axis_font( "GOTHIC_FONT", 8 );
         15 $graph->set_x_label_font( "GOTHIC_FONT", 10 );
         16 $graph->set_y_axis_font( "GOTHIC_FONT", 8 );
         17 $graph->set_y_label_font( "GOTHIC_FONT", 8 );
         18
         19 my $image = $graph->plot( ¥@data );
         20
         21 open( OUT, "> graph.jpg") or die( "Cannot open file: graph.jpg" );
         22 binmode OUT;
         23 print OUT $image->jpeg();
         24 close OUT;
         25
         26

     perl graph.cgi
     ls -al
     
     graph.jpgが出来た。
     
      [root@localhost perlGraph]# ls -l
      合計 16
      -rw-r--r-- 1 root root   854  3月 18 14:21 graph.cgi
      -rw-r--r-- 1 root root 11239  3月 18 14:28 graph.jpg

     日本語が文字化けするぞ。
     

     

     

     


     フォントダウンロード
      wget "https://ja.osdn.net/frs/redir.php?m=jaist&f=%2Fvlgothic%2F62375%2FVLGothic-20141206.zip"
      ファイル名が長いので
      mv *.zip font.zip
      解凍
      unzip font.zip
      lsで見ると
      VLGothicというフォルダがあり
      その中に
       VL-Gothic-Regular.ttf
      と
       VL-PGothic-Regular.ttf
      が有ったので
       cp VLGothic/VL-Gothic-Regular.ttf GOTHIC_FONT.ttf
     再度実行
      perl graph.cgi
     うまく日本語が書けた
     

     


     よし。
     
     次は折れ線グラフ
     
     graph.cgi
          1 #!/usr/bin/perl -w
          2 use strict;
          3
          4 use GD::Graph::mixed;
          5 use GD::Graph::colour qw( :files );
          6 use GD::Text;
          7 use Jcode;
          8
          9 GD::Graph::colour::read_rgb( "/usr/lib/X11/rgb.txt" ) or
         10   die( "Can't read colours" );
         11
         12 my @labels = qw( under 10s  20s  30s  40s  50s  60s  70s over );
         13 my @male   = qw(    8   20   25   33   29    8    7    8    0 );
         14 my @female = qw(   12   20   35   47   36    7    3   12    5 );
         15 my @differ = qw(    1    3    9   10    2    1    5    2    0 );
         16 my @data   = ( ¥@labels, ¥@male, ¥@female, ¥@differ);
         17
         18 my $graph = GD::Graph::mixed->new( 400, 300 );
         19
         20 $graph->set( title            => jcode("にこにこ村の人口")->utf8,
         21              t_margin         => 10,
         22              b_margin         => 10,
         23              l_margin         => 10,
         24              r_margin         => 10,
         25              x_label          => jcode("年齢")->utf8,
         26              x_label_position => 0.5,
         27              y_label          => jcode("人数")->utf8,
         28              types            => [ qw(bars bars linespoints) ],
         29              dclrs            => [ qw(AliceBlue LavenderBlush DarkSalmon) ],
         30              boxclr           => "snow",
         31              y_tick_number    => 10,
         32              y_label_skip     => 2,
         33              line_width       => 1,
         34              markers          => [ 7 ],
         35              marker_size      => 2,
         36              bar_width        => 10,
         37              bar_spacing      => 3,
         38              cumulate         => 1
         39            );
         40
         41 $graph->set_legend( jcode("男性")->utf8,
         42                     jcode("女性")->utf8,
         43                     jcode("前年差")->utf8);
         44
         45 GD::Text->font_path( "./" );
         46 $graph->set_title_font( "GOTHIC_FONT", 12 );
         47 $graph->set_legend_font( "GOTHIC_FONT", 7 );
         48 $graph->set_x_axis_font( "GOTHIC_FONT", 7 );
         49 $graph->set_x_label_font( "GOTHIC_FONT", 9 );
         50 $graph->set_y_axis_font( "GOTHIC_FONT", 7 );
         51 $graph->set_y_label_font( "GOTHIC_FONT", 7 );
         52
         53 my $image = $graph->plot( ¥@data ) or die( "Cannot create image" );
         54
         55 open( OUT, "> graph2.png") or die( "Cannot open file: graph2.png" );
         56 binmode OUT;
         57 print OUT $image->png();
         58 close OUT;
        
     9行目エラーになる。
     私の環境では/usr/lib/X11/の中身はからっぽです。
     なので、findした。
     find / -name rgb.txt
     見つかる。
     
     cp /root/.cpan/build/GDGraph-1.54-iqDdqm/samples/rgb.txt /usr/lib/X11/rgb.txt

     また実行。

     今度は29行目でエラーになる。
     rgb.txtの中身と合っていないのか?と思ったので以下のようにあわせて変更
      dclrs => [ qw(aliceblue lavenderblush darksalmon) ],
     
     また実行。
     エラーが出なかった。
     graph2.pngが出来ているので見てみる。
     
     できた。

     

     

    棒グラフ部分を積算しない場合は

         30 $graph->set( title            => jcode("にこにこ村の人口")->utf8,
         31              t_margin         => 10,
         32              b_margin         => 10,
         33              l_margin         => 10,
         34              r_margin         => 10,
         35              x_label          => jcode("年 齢")->utf8,
         36              x_label_position => 0.5,
         37              y_label          => jcode("人数")->utf8,
         38              types            => [ qw(bars bars linespoints) ],
         39 #             types            => [ qw(linespoints linespoints linespoints) ],
         40 #             dclrs            => [ qw(AliceBlue LavenderBlush DarkSalmon) ],
         41              dclrs            => [ qw(blue lavender darksalmon) ],
         42              boxclr           => "snow",
         43              y_tick_number    => 10,
         44              y_label_skip     => 2,
         45              line_width       => 1,
         46 #             markers          => [ 7 ],
         47 #             markers          => [ 6, 7, 8 ],
         48              marker_size      => 2,
         49              bar_width        => 10,
         50              bar_spacing      => 3,
         51              cumulate         => 0
         52            );
    ※ポイントは「cumulate         => 0」部分です。

     

     
     全部折れ線グラフにする場合はこうすると良し
         20 $graph->set( title            => jcode("にこにこ村の人口")->utf8,
         21              t_margin         => 10,
         22              b_margin         => 10,
         23              l_margin         => 10,
         24              r_margin         => 10,
         25              x_label          => jcode("年 齢")->utf8,
         26              x_label_position => 0.5,
         27              y_label          => jcode("人数")->utf8,
         28 #             types            => [ qw(bars bars linespoints) ],
         29              types            => [ qw(linespoints linespoints linespoints) ],
         30 #             dclrs            => [ qw(AliceBlue LavenderBlush DarkSalmon) ],
         31              dclrs            => [ qw(blue lavender darksalmon) ],
         32              boxclr           => "snow",
         33              y_tick_number    => 10,
         34              y_label_skip     => 2,
         35              line_width       => 1,
         36 #             markers          => [ 7 ],
         37              markers          => [ 6, 7, 8 ],
         38              marker_size      => 2,
         39              bar_width        => 10,
         40              bar_spacing      => 3,
         41              cumulate         => 1
         42            );
     線にすると色が薄くて見えないので色は少し濃い色に変更!!

     


     円グラフ
     graph3.cgi
          1 #!/usr/bin/perl -w
          2 use strict;
          3
          4 use GD::Graph::pie;
          5 use GD::Graph::colour qw( :files );
          6 use GD::Text;
          7 use Jcode;
          8
          9 GD::Graph::colour::read_rgb( "/usr/lib/X11/rgb.txt" ) or
         10   die( "Can't read colours" );
         11
         12 my @data = ( [ jcode("好 き")->utf8, jcode("嫌 い")->utf8,
         13                jcode("どちらともいえない")->utf8, jcode("無回答")->utf8 ],
         14              [ 43, 15, 32, 10 ] );
         15
         16 my $graph = GD::Graph::pie->new( 400, 300 );
         17
         18 $graph->set( title          => jcode("にこにこ村について")->utf8,
         19              t_margin       => 10,
         20              b_margin       => 10,
         21              l_margin       => 10,
         22              r_margin       => 10,
         23              axislabelclr   => 'black',
         24              dclrs          => [ qw(mediumslateblue mediumseagreen darksalmon floralwhite) ],
         25              pie_height     => 36,
         26              start_angle    => 230,
         27              transparent    => 0,
         28            );
         29
         30 GD::Text->font_path( "./" );
         31 $graph->set_title_font( "GOTHIC_FONT", 12 );
         32 $graph->set_value_font( "GOTHIC_FONT", 8 );
         33
         34 my $image = $graph->plot( ¥@data ) or die( "Cannot create image" );
         35
         36 open( OUT, "> graph3.png") or die( "Cannot open file: graph3.png" );
         37 binmode OUT;
         38 print OUT $image->png();
         39 close OUT; 

     

     


    グラフの設定一覧
    title グラフのタイトル
    t_margin Top マージン
    b_margin Bottom マージン
    l_margin Left マージン
    r_margin Right マージン
    x_label X軸ラベル
    y_label Y軸ラベル
    y_max_value Y軸の最大値
    y_tick_number Y軸を刻む数
    y_label_skip Y軸ラベルのスキップ
    types mixed タイプのグラフの場合、各データをどの種類のグラフにするか無名配列でリストする
    cumulate データセットが積算される(棒グラフ、面グラフ)
    line_types 線グラフの線の種類を無名配列でリストする( 1:実線 2:ダッシ 3:点線 4:点線 )
    line_width 線グラフの太さ
    markers 点、点付折れ線グラフで使われる点の種類を無名配列でリストする
    ( 1:塗り四角 2:四角 3:十字 4:クロス十字 5:塗り菱形 6:菱形 7:塗り丸 8:丸 )
    marker_size 点、点付折れ線グラフで使われる点のサイズ(デフォルト 4)
    bar_width 棒グラフの幅
    bar_spacing 棒グラフ間の幅
    bgclr グラフの背景色
    fgclr グラフの前景色
    boxclr グラフ内の背景色
    dclrs グラフの色を無名配列でリストする
    accentclr グラフの外枠の色
    shadowclr グラフの影の色
    shadow_depth グラフの影の幅

    また、よく使いそうなメソッドもリストしておきます。

    set_legend() 凡例となる文字列をリストする
    set_text_clr() 文字の色

    ちなみに、12行目と13〜22行目は同じ意味です。
    実際にDBからデータ持ってきて表示する場合は13行目〜方法だよね。
         12 #my @labels = qw( under 10s  20s  30s  40s  50s  60s  70s over );
         13 my @labels;
         14 $labels[0] = "under";
         15 $labels[1] = "10s";
         16 $labels[2] = "20s";
         17 $labels[3] = "30s";
         18 $labels[4] = "40s";
         19 $labels[5] = "50s";
         20 $labels[6] = "60s";
         21 $labels[7] = "70s";
         22 $labels[8] = "over";
        


    スポンサーサイト

    0
      • 2019.10.22 Tuesday
      • -
      • 16:16
      • -
      • -
      • by スポンサードリンク


      PR

      calendar

      S M T W T F S
        12345
      6789101112
      13141516171819
      20212223242526
      2728293031  
      << October 2019 >>

      selected entries

      categories

      archives

      recent comment

      recent trackback

      profile

      search this site.

      others

      mobile

      qrcode

      powered

      無料ブログ作成サービス JUGEM