[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