GD::Graph::mixed

GD::Graph::mixed(混合グラフ)

GD::Graph::mixed(混合グラフ)

[user]$ vim mixed.pl

#!/usr/bin/perl

use  strict;
use  warnings;
use  v5.10;
use  GD::Graph::mixed;   # 混合グラフ

# 画像サイズ
use Readonly;
Readonly  my  $WIDTH  => 250;
Readonly  my  $HEIGHT => 250;

# データ
my @day_of_the_week = qw( 日 月 火 水 木 金 土 );
my @month           = qw(  8  8  5  5 12  4  4 );
my @this_week       = qw(  3  2  1  1  2  1  1 );
my @data            = ( \@day_of_the_week, \@month, \@this_week );

# GD::Graph::mixed オブジェクト作成
my $graph_obj = GD::Graph::mixed->new( $WIDTH, $HEIGHT );

# 凡例
$graph_obj->set_legend( '月間', '週間' );

# パラメータ設定
use List::Util qw( max );
my $max = max @month;

# 左側 y 軸の最大値( 5, 10, 15, 25, 50, 75, 100 )
my $ymax1 = undef;
if    ( $max <=  5 ) { $ymax1 =   5; }
elsif ( $max <= 10 ) { $ymax1 =  10; }
elsif ( $max <= 15 ) { $ymax1 =  15; }
elsif ( $max <= 25 ) { $ymax1 =  25; }
elsif ( $max <= 50 ) { $ymax1 =  50; }
elsif ( $max <= 75 ) { $ymax1 =  75; }
else                    { $ymax1 = 100; }

$graph_obj->set(
    title         => '販売数',                 # タイトル
    x_label       => '曜日',                   # x 軸のラベル
    two_axes      => 1,                        # y 軸を左右に表示
    y1_label      => '月間販売数',             # 左側 y 軸のラベル
    y2_label      => '週間販売数',             # 右側 y 軸のラベル
    y_min_value   => 0,                        # y 軸の最小値
    y1_max_value  => $ymax1,                   # 左側 y 軸の最大値
    y2_max_value  => 5,                        # 右側 y 軸の最大値
    y_tick_number => 5,                        # y 軸に付ける目盛り数
    y_label_skip  => 2,                        # 目盛りをスキップ
    types         => ['bars', 'lines'],        # グラフの種類
    bar_width     => 8,                        # 棒の幅
    bgclr         => '#ffffff',                # 背景色
    dclrs         => ['#9999ff', '#ff0000'],   # グラフの色
    show_values   => 1,                        # 値を表示
    values_format => '%02d',                   # 値表示用フォーマット
);

# 日本語使用([user]$ locate .ttf で調べる)
Readonly  my  $TTF => '/usr/share/fonts/vlgothic/VL-Gothic-Regular.ttf';
$graph_obj->set_title_font( $TTF, 8 );     # タイトル
$graph_obj->set_x_axis_font( $TTF, 8 );    # x 軸
$graph_obj->set_x_label_font( $TTF, 8 );   # x 軸のラベル
$graph_obj->set_y_label_font( $TTF, 8 );   # y 軸のラベル
$graph_obj->set_legend_font( $TTF, 8 );    # 凡例

# GD::Image オブジェクト作成
my  $img_obj = $graph_obj->plot(\@data) or croak $graph_obj->error;

# ファイルへ出力
use  Carp qw( croak );
use  Fcntl;
use  IO::Handle;
my  $tmpfn = "tmp.$$";    # テンポラリーファイル名
my  $imgfn = 'mixed.png'; # 画像ファイル名
sysopen  ( my $fh, $tmpfn, O_WRONLY | O_TRUNC | O_CREAT, 0644 )  or  croak  qq{can't open :$!};
flock $fh, 2;
print  {$fh}  $img_obj->png()  or  croak  qq{can't write :$!};
# ファイルファンドルへの出力をバッファしない
$fh->flush               or  croak  qq{can't flush :$!};
# メモリ上にあるファイルの内容をストレージデバイス上のものと同期させる
$fh->sync                or  croak  qq{can't fsync :$!};
close  $fh                  or  croak  qq{can't close :$!};
# ファイル名変更
rename  $tmpfn, $imgfn  or  croak  qq{can't rename $tmpfn to $imgfn :$!};

[user]$ chmod 700 mixed.pl

[user]$ ./mixed.pl