ChinaUnix首页 > 精华文章 > Perl > 正文

[原创] GD::Graph模块的一点总结,希望能有人需要


http://www.chinaunix.net 作者:King_Leo  发表于:2008-03-20 16:25:52
发表评论】 【查看原文】 【Perl讨论区】【关闭

换工作了,平时也没少得到办理朋友的帮助
这些东西是我最近总结的,主要是cpan 上GD::Graph模块的文档和sample代码的一点注释和总结
希望能对需要的朋友有帮助。
在这里也谢谢那些平时经常解答问题的朋友,特别感谢版主和apile大哥

我平时的主要工作是做报表
应用的主要模块是spreadSheet::WriteExcel
下边的每个程序都是我自己跑过的

#!/usr/local/bin/perl
# 柱图示例程序
# 创建时间:2008-02-20
# 更多详情是查看cpan文档及示例程序
use strict;
use GD::Graph::bars;
use GD::Graph::hbars;
use GD::Graph::Data;
use Encode;         # 用于处理汉字问题
my $data = GD::Graph::Data->new(  # 数据集必须是一维数组(或其引用),其中存储的是各个子数据数组的引用
[
    ["2007-01","2007-02","2007-03","2007-04","2007-05","2007-06","2007-07", "2007-08", "2007-09"],
    [    50000,   12000,   24000,   33000,   19000,    8000,    6000,    15000,    21000],
    [    10000,    20000,    50000,    60000,    30000,  15124,    10000,     30000,     40000],
]
) or die GD::Graph::Data->error;

my @names = qw/GDBar GDBar-h/;
for my $my_graph (GD::Graph::bars->new(600,400),
                  GD::Graph::hbars->new(600,400))
{
    my $name = shift @names;
    print STDERR "Processing $name\n";
    $my_graph->set( 
     # 与坐标轴有关的选项设定
     title               => decode("gb2312",'流量图'),     # 标题
     x_label             => decode("gb2312",'月份'),      # X轴标签(说明)
     two_axes            => 1,         # 两条坐标轴
     y1_label            => decode("gb2312",'流入流量(kbps)'), # Y轴标签(说明)  --- 可以有两个Y轴
     y2_label            => decode("gb2312",'流出流量(kbps)'),
     y1_max_value        => 60000,       # Y轴最大坐标值
#     y2_max_value        => 8,         # 默认为自动匹配
     y_tick_number       => 8,         # Y轴坐标的个数
     y_label_skip        => 2,         # Y轴每隔几个显示一次坐标值
#     y_plot_values      => 1,         # 默认为1显示,是否显示刻度值
     long_ticks          => 1,         # 默认为0(正常的短刻度线), 1:长坐标刻度线
#     tick_length     => 4,                 # 控制刻度线长度,与long_ticks => 0, 配套使用
#     x_ticks            => 0,         # 作用与long_ticks相同,限定X轴不显示刻度线,这样就只显示一条长刻度线
   x_plot_values      => 1,         # 默认为1,控制是否显示X轴刻度,如果设为0,则 x_ticks 属性将无效   
   y1_number_format    => sub { # from perlfaq5   # 控制坐标轴格式的子函数。
                   local $_ = shift;
                   1 while s/^([-+]?\d+)(\d{3})/$1,$2/;  # 此为数字分隔效果:20,000
                   $_;
              },
   y2_number_format    => sub { my $v = shift; sprintf("%.2f",$v/1024) }, # 控制坐标轴格式
#   zero_axis_only      => 1,         # 默认为0,当设为1时,将只画出0坐标轴,而不会在图的底部画轴,坐标也将在0轴上标注,都用于有正负值的图
#   use_axis            => [1, 2, 2],        # 当有两个坐标轴但是有三个数据集的时候。
                        # 可以设定这三个数据集分别使用左右哪个坐标轴
                        # 同时图例要设置三个数据集颜色:dclrs => [qw(lgreen lred lred)],
   legend_placement    => 'RT',       # 图例位置
   
   # bar选项
   bar_spacing         => 1,         # 同组柱间距
   bargroup_spacing   => 10,        # 柱组间距
   shadow_depth      => 4,         # 阴影宽度
   accent_treshold   => 200,        # 当bar的宽度大于此值时,bar的边缘会产生分界线,
                        # 如果想让图片效果连贯,则将此值设的比较大
   show_values         => 1,         # 在柱图上边标注数值
   values_format       => "%3.2f",      # 数值格式
#     cumulate          => 2,         # bar图的另一种形式。显示为积累方式。比较多用于体现出增长的情况
#   overwrite           => 1,         # 0:没有覆盖,普通柱图,两个bar平行。 1:两个bar相互覆盖。即在统一直线上 2:类似cumulate => 1的效果
     
     
     # 图例说明
     legend_placement    => 'RT',       # 图例位置
     x_label_position    => 1/2,
     
     # 颜色选项
     bgclr          => 'white',
     fgclr               => 'white',
     boxclr              => 'dblue',
     accentclr           => 'dblue',
     valuesclr           => '#ffff77',
     dclrs               => [qw(lgreen lred)], # 设置数据集对应的颜色。设置为undef将隐藏该数据组
    
     
    
     logo                => 'zhong-ying.png',# logo 制作好的图片放在/usr/local/src/soft/GDGraph-1.44_01/t/images目录下
     logo_position       => 'BR',
    
     transparent         => 0,        # 设定为1,背景色将变为透明色
    
     l_margin            => 10,       # 各个边距
     b_margin            => 10,
     r_margin            => 10,
     t_margin            => 10,
    
    ) or warn $my_graph->error;
    if ($name =~ /-h$/)  # 横向图效果更好
    {
   $my_graph->set(x_labels_vertical => 0, values_vertical => 0);  # 横向图:横轴标签为水平,柱上数值为水平方式
   $my_graph->set_legend('bottom axis', 'top axis');        # 设定图例内容 设置为undef将隐藏该图例
    }
    else
    {
   $my_graph->set(x_labels_vertical => 1, values_vertical => 1);
   $my_graph->set_legend('left axis', 'right axis');
    }
  # 相关字体设置
  # 字体文件SURSONG.TTF可在windos系统下寻找合适的自己文件
    $my_graph->set_y_label_font('/shvpn/test/wlj/GD/SURSONG.TTF', 12);    # Y轴说明
    $my_graph->set_x_label_font('/shvpn/test/wlj/GD/SURSONG.TTF', 12);    # X轴说明
    $my_graph->set_y_axis_font('/shvpn/test/wlj/GD/SURSONG.TTF', 12);  # Y轴坐标
    $my_graph->set_x_axis_font('/shvpn/test/wlj/GD/SURSONG.TTF', 12);  # X轴坐标
    $my_graph->set_title_font('/shvpn/test/wlj/GD/SURSONG.TTF', 16);     # 标题
    $my_graph->set_legend_font('/shvpn/test/wlj/GD/SURSONG.TTF', 14);    # 图例
    $my_graph->set_values_font('/shvpn/test/wlj/GD/SURSONG.TTF', 12);    # 数值
  
  
    $my_graph->plot($data) or die $my_graph->error;
    save_chart($my_graph, $name);
}
sub save_chart
{
 my $chart = shift or die "Need a chart!";
 my $name = shift or die "Need a name!";
 local(*OUT);
 my $ext = $chart->export_format;
 open(OUT, ">$name.$ext") or 
 die "Cannot open $name.$ext for write: $!";
 binmode OUT;
 print OUT $chart->gd->$ext();
 close OUT;
}


=====================================================================
=====================================================================

#!/usr/local/bin/perl
# line示例程序
# 创建时间:2008-02-20
# 更多详情是查看cpan文档及示例程序
use GD::Graph::lines;
use Encode;         # 用于处理汉字问题
print STDERR "Processing GDLine\n";
@data = ( 
    [ qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec) ],
    [ reverse(4, 3, 5, 6, 3,  1.5, -1, -3, -4, -6, -7, -8)],
    [        (4, 3, 5, 6, 3,  1.5, -1, -3, -4, -6, -7, -8)],
    [        (2, 2, 2, 5, 5,  4.5,1.5,  2,  3,  5,  4,  3)],
);
$my_graph = new GD::Graph::lines();
$my_graph->set( 
 x_label => decode("gb2312",'月份'),
 y_label => decode("gb2312",'故障增量'),
 title => decode("gb2312",'故障增量情况统计图'),
 y_max_value => 8,
 y_min_value => -8,
 y_tick_number => 16,
 y_label_skip => 2,
 box_axis => 0,       # 默认为1,通过轴包成一个box状
 zero_axis_only => 1,    # 默认为0,当设为1时,将只画出0坐标轴,而不会在图的底部画轴,坐标也将在0轴上标注
 x_label_position => 1,
 y_label_position => 1,
# x_tick_number => 'auto',  # 自动设定X轴的坐标,以达到美观的效果,主要用于画时序图
 x_label_skip => 3,
 x_tick_offset => 2,     #  X轴坐标签的偏移量。隔过两个,从第三个开始显示
 
 # 关于 line
 line_width => 3,      # Line的宽度,默认1
 dclrs           => [black,red,green],  # 线的颜色
 line_types => [ 1, 2, 3 ],    # Available line types are 1: solid, 2: dashed, 3: dotted, 4: dot-dashed.
 line_type_scale => 10,   # 控制虚线(dashed)的长度,主要用于区别point
 
 
  l_margin            => 10,       # 各个边距
 b_margin            => 10,
 r_margin            => 10,
 t_margin            => 10,
 
 transparent => 0,
);
$my_graph->set_legend(decode("gb2312",'上海'), decode("gb2312",'甘肃'), decode("gb2312",'河南'));
# 相关字体设置
    $my_graph->set_y_label_font('/shvpn/test/wlj/GD/SURSONG.TTF', 12);    # Y轴说明
    $my_graph->set_x_label_font('/shvpn/test/wlj/GD/SURSONG.TTF', 12);    # X轴说明
    $my_graph->set_y_axis_font('/shvpn/test/wlj/GD/SURSONG.TTF', 12);  # Y轴坐标
    $my_graph->set_x_axis_font('/shvpn/test/wlj/GD/SURSONG.TTF', 12);  # X轴坐标
    $my_graph->set_title_font('/shvpn/test/wlj/GD/SURSONG.TTF', 16);     # 标题
    $my_graph->set_legend_font('/shvpn/test/wlj/GD/SURSONG.TTF', 14);    # 图例
    $my_graph->set_values_font('/shvpn/test/wlj/GD/SURSONG.TTF', 12);    # 数值
# 制图
open(IMG, '>./GDLine.png') or die $!;
print IMG $my_graph->plot(\@data)->png;
close IMG;

===========================================================================
===========================================================================

#!/usr/local/bin/perl
# 饼图示例程序
# 创建时间:2008-02-20
# 更多详情是查看cpan文档及示例程序
use GD::Graph::pie;
use Encode;         # 用于处理汉字问题
print STDERR "Processing GDPie\n";
@data = (  # 数据集必须是一维数组(或其引用),其中存储的是各个子数据数组的引用
    ["1st(50%)","2nd(20%)","3rd(30%)","4rd(0.01%)"],  # 目前并有选项可以直接控制饼图上数值的显示方式,只能手工指定显示方式
    [    500,     200,       300,    1]
);
$my_graph = new GD::Graph::pie( 400, 300 );
#$my_graph = new GD::Graph::pie( );
$my_graph->set( 
 title      =>   decode("gb2312",'测试饼图'),   # 标题
# label      =>   'Label',      # 类似于饼图的说明,看情况可有可无
 axislabelclr   =>   'white',      # 分割线颜色
 pie_height    =>   20,           # 做出3D效果,设定饼图高度
 dclrs           =>   [qw(lgreen lred blue black)],  # 设定饼图片颜色,如果不设定则默认自动分配
 
 start_angle   =>   235,         # 第一个饼的起始角度  0°为正下方开始
 suppress_angle  =>   5,           # 默认为0 小于这个值时饼图将不画这个角
                      # 现在的GD::Graph不能够像JfreeChart那样引出一条线去显示数值
                      # 所以用这种方式避免图显得很乱
 
 legend_placement    => 'RR',       # 图例位置 
 legend_spacing   => 10,
# show_values         => 1,         # 这个选项在饼图中无效
 
  l_margin            => 20,        # 各个边距
 b_margin            => 20,
 r_margin            => 20,
 t_margin            => 20,
 
 transparent => 0,
);
$my_graph->set_legend("1st(50".decode("gb2312",'人').")", decode("gb2312",'2nd(20人)') ,decode("gb2312",'3rd(30人)'), decode("gb2312",'4rd(1人)')),  # 目前并有选项可以直接控制图例上数值的显示方式,只能手工指定显示方式
#$my_graph->set_value_font(GD::Font->Giant);
#$my_graph->set_legend_font(GD::Font->Large);
$my_graph->set_title_font('/shvpn/test/wlj/GD/SURSONG.TTF', 18);
$my_graph->set_label_font('/shvpn/test/wlj/GD/SURSONG.TTF', 15);
$my_graph->set_value_font('/shvpn/test/wlj/GD/SURSONG.TTF', 12);
$my_graph->set_legend_font('/shvpn/test/wlj/GD/SURSONG.TTF', 12); # 图例字体格式  (字体,字号)
open(IMG, '>./GDPie.png') or die $!;
print IMG $my_graph->plot(\@data)->png;
close IMG;


===========================================================================
===========================================================================

下边这个就是个零碎的选项注释:

# sample1* -- bar 柱图
# sample2* -- area 片图
# sample3* -- point 点图
# sample4* -- linePoint 点线图
# sample5* -- line 线图
# sample6*7* -- fix 混合图
# sample18.pl  sample42.pl 描述了特殊的赋值方式

$my_graph->set( 
 x_label         => 'X Label',
 y_label         => 'Y label',
 title           => 'Two data sets',
 long_ticks      => 0,         # 短刻度线,可通过tick_length控制刻度线长度
 long_ticks       => 1,   # 显示长刻度线
  x_ticks          => 0,   # 同时限定X轴不显示刻度线,这样就只显示一条长刻度线
 y_max_value     => 40,
 x_tick_number => 'auto',  # 自动设定X轴的坐标,以达到美观的效果 如果设定x_tick_number为某一个数值则X轴将画出这么多个坐标,默认Undef每个值都作为轴坐标显示
 y_tick_number   => 8,    # 设定y轴刻度线的个数
 x_label_skip => 3,     # 
 x_tick_offset => 2,     # X轴坐标签的偏移量。隔过两个,从第三个开始显示
 y_label_skip    => 2,    # 每隔几个可读线才显示值
 y_plot_values    => 1,   # 逐个显示刻度值,与跳过刻度值相对。
  x_plot_values    => 1,
  x_plot_values   => 0,   # 是否显示坐标值 默认1  0:不显示
 bar_spacing     => 3,         # 柱间距
 bargroup_spacing => 10,        # 柱组间距
 shadow_depth    => 4,
 accent_treshold => 200,        # 当bar的宽度大于此值时,bar的边缘会产生分界线,如果想让图片效果连贯,则将此值设的比较大
 transparent     => 1,         # 设定为1,背景色将自动改为透明色
 zero_axis_only      => 1,    # 默认为0,当设为1时,将只画出0坐标轴,而不会在图的底部画轴,坐标也将在0轴上标注
 two_axes            => 1,       # 两条坐标轴
 use_axis            => [1, 2, 2],     # 当有两个坐标轴但是有三个数据集的时候。
                    # 可以设定这三个数据集分别使用左右哪个坐标轴
                    # 同时图例要设置三个数据集颜色:dclrs => [qw(lgreen lred lred)],
 legend_placement    => 'RT',     # 图例位置
 
 show_values         => 1,     # 在柱图上边标注数值
 values_format       => "%3.2f",  # 数值格式
 y1_number_format    => sub { # from perlfaq5   # 控制坐标轴格式的子函数。
   local $_ = shift;
   1 while s/^([-+]?\d+)(\d{3})/$1,$2/;  # 此为数字分隔效果:20,000
   $_;
 },
 y2_number_format    => sub { my $v = shift; sprintf("%.2f",$v/1024) }, # 控制坐标轴格式
 
 
 interlaced       => 1,   # 默认为1 ,没明白效果
 
 $my_graph->set(x_labels_vertical => 0, values_vertical => 0);  # 横向图:横轴标签为水平,柱上数值为水平方式
 $my_graph->set_legend('bottom axis', 'top axis');        # 设定图例内容
 
 cumulate        => 2,           # bar图的另一种形式。显示为积累方式。
 overwrite           => 1,    # 0:没有覆盖,普通柱图,两个bar平行。 1:两个bar相互覆盖。即在统一直线上 2:类似cumulate => 1的效果
# cumulate       => 1,    # 此属性不适合含有负值的图,用作查看增长情况不错。
 
 dclrs           => [ undef, qw(dgreen green) ],  # 第一个数据集没有定义颜色,则默认为透明,即隐藏起来。
 $my_graph->set_legend(undef, qw(low high));    # 第一个图例定义为undef,则隐藏第一个图例
 
 
 # 点图  new GD::Graph::points
 marker_size => 6,  # 点的大小
 markers => [ 5,7 ], # Available markers are: 
                 # 1: filled square, 2: open square, 3: horizontal cross, 
                 # 4: diagonal cross, 5: filled diamond, 6: open diamond, 
                 # 7: filled circle, 8: open circle, 9: horizontal line, 
                 # 10: vertical line. Note that the last two are not part of the default list.
                 # Default: [1,2,3,4,5,6,7,8]
 # 点线图 new GD::Graph::linespoints
 skip_undef => 1,  # 默认为0,设为1:将跳过没有定义的点,则line将会断。如果设为0,则会直接连上有值的点
 
 # 线图  new GD::Graph::lines
 box_axis => 0,   # 是否把轴圈成一个box 默认是1
 line_width => 3,  # line的宽度 默认1
 line_types => [ 1, 2, 3, 4 ],    # Available line types are 1: solid, 2: dashed, 3: dotted, 4: dot-dashed.
 line_type_scale => 10,   # 控制虚线(dashed)的长度,主要用于区别point
 legend_marker_width => 24, # 图例的宽度(还可设定高度)
 no_axes => 1,   #默认值undef画出所有轴, 设定为0,1有不同的含义
 
 # 饼图 GD::Graph::pie
 pie_height => 30,  # 饼图的高度,做出3D的效果
 start_angle => 235,  # 第一个饼的起始角度  0°为正下方开始
 suppress_angle => 5,   # 默认为0 小于这个值时饼图将不画这个角
 '3d' => 0,      # 默认3D  设为0 画二维饼图
 # 控制字帖大小
 $my_graph->set_value_font(GD::Font->Giant);
 GD::Font->Small 
 GD::Font->Large
 GD::Font->MediumBold 
 GD::Font->Tiny
 GD::Font->Giant

==============================================================
===============================================================

sub save_chart
{
 my $chart = shift or die "Need a chart!";
 my $name = shift or die "Need a name!";
 local(*OUT);
 my $ext = $chart->export_format;
 open(OUT, ">$name.$ext") or 
  die "Cannot open $name.$ext for write: $!";
 binmode OUT;
 print OUT $chart->gd->$ext();
 close OUT;
}
1;


=============================================================
=============================================================

[ 本帖最后由 King_Leo 于 2008-3-11 20:09 编辑 ]



 King_Leo 回复于:2008-03-07 15:33:40

这个是一个用SpreadSheet::WriteEXcel 和GD::Graph配合制报表的一个例子

#!/usr/local/bin/perl
# 图表报表实例程序
# 创建时间:2008-02-20
# 更多详情是查看cpan文档及示例程序
use strict;
use Spreadsheet::WriteExcel; 
use GD::Graph::bars;
use GD::Graph::hbars;
use GD::Graph::Data;
use Encode; # 用于处理汉字问题

require("/shvpn/nms/lib/SetBookFmt.pl");

print "Strat testing GD Graph report \n";

# 创建报表文件句柄
my $dest_book  = Spreadsheet::WriteExcel->new("./TestGDReport.xls");
# 创建sheet页
my $dest_sheet =  $dest_book->add_worksheet( decode("gb2312", 'GD图形测试报表') );

# 报表格式 以下格式在nms/lib/SetBookFmt.pl函数中进行了定义,详见Spreadsheet::WriteExcel说明文档
my $fmt_head=&SetBookFmt($dest_book,"fmt_title");
$fmt_head->set_size(15);
# 标题
my $fmt_title=&SetBookFmt($dest_book,"fmt_title");
# 副标题
my $fmt_subtitle=&SetBookFmt($dest_book,"fmt_subtitle");
# 列标题
my $fmt_coltitle =&SetBookFmt($dest_book,"fmt_coltitle");
# 数据
my $fmt_data = &SetBookFmt($dest_book,"fmt_data");

# 报表所需数据集
# 月份
my @month = qw(2007-01 2007-02 2007-03 2007-04 2007-05 2007-06 2007-07 2007-08 2007-09);
# 流入流量
my @inFlux = qw(50000 12000 24000 33000 19000 8000 6000 15000 21000);
# 流出流量
my @outFlux = qw(10000 20000 50000 60000 30000 15124 10000 30000 40000);

###------- 绘制数据表格部分 --------###
# 开始绘制表头
$dest_sheet->set_row(0,30); # 设置行高
$dest_sheet->set_column(0,2,20); # 设置列宽
$dest_sheet->merge_range(0,0,0,2,decode("gb2312"," GD测试报表"),$fmt_head);
$dest_sheet->merge_range(1,0,1,2,decode("gb2312"," 此报表主要用于演示报表的主要制作流程及测试GD制图的效果 "),$fmt_subtitle);

# 打印列标题
$dest_sheet->write(2,0,decode("gb2312",'月份'), $fmt_coltitle);
$dest_sheet->write(2,1,decode("gb2312",'流入流量(bps)'), $fmt_coltitle);
$dest_sheet->write(2,2,decode("gb2312",'流出流量(bps)'), $fmt_coltitle);

# 制表:
my $endLine = 3; #当前行号
for (my $i = 0; $i <= $#month; $i++) {
$dest_sheet->write($endLine,0,$month[$i],$fmt_data);
$dest_sheet->write($endLine,1,$inFlux[$i],$fmt_data);
$dest_sheet->write($endLine,2,$outFlux[$i],$fmt_data);
$endLine++;
}

### ------- 绘制表格结束 ----------###

### ------- 开始绘制统计图 ---- ###

# 整理统计图所需data数据集
my @data; # 数据集必须是一维数组,其中存储的是各个子数据数组的引用
push @data, \@month;
push @data, \@inFlux;
push @data, \@outFlux;

# 绘制bar图:
&createBarChart(\@data);

# 插入绘制成功的bar图:
$endLine += 3;
$dest_sheet->insert_image($endLine,0,"./tmpGDBar.png");

# 也可以增加sheet页:
my $dest_sheet_add =  $dest_book->add_worksheet( decode("gb2312", '增加sheet页') );
# 按照特定报表需要,写入数据及统计图
$dest_sheet_add->insert_image(5,5,"./tmpGDBar.png");
# insert_image($row, $col, $filename, $x, $y, $scale_x, $scale_y) 参数说明,详见capn文档
  # $row,$col坐标
# $filename 全路径文件名
# $x, $y,其实单元格的偏移量
# $scale_x, $scale_y 图片比例

# 关闭文件句柄,报表创建成功
$dest_book->close();
# 删除临时的统计图文件
unlink ("./tmpGDBar.png");
print ("create GD Report succeed ! \n");


sub createBarChart{
my $data = shift;

my $my_graph = GD::Graph::hbars->new(600,400);
                 
  print STDERR "Processing PNG\n";

  $my_graph->set( 
   # 与坐标轴有关的选项设定
   title               => decode("gb2312",'流量图'), # 标题
   x_label             => decode("gb2312",'月份'), # X轴标签(说明)
   two_axes            => 1, # 两条坐标轴
   y1_label            => decode("gb2312",'流入流量(kbps)'), # Y轴标签(说明)  --- 可以有两个Y轴
   y2_label            => decode("gb2312",'流出流量(kbps)'),
   y1_max_value        => 60000, # Y轴最大坐标值
#     y2_max_value        => 8, # 默认为自动匹配
   y_tick_number       => 8, # Y轴坐标的个数
   y_label_skip        => 2, # Y轴每隔几个显示一次坐标值
#     y_plot_values     => 1, # 默认为1显示,是否显示刻度值
   long_ticks          => 1, # 默认为0(正常的短刻度线), 1:长坐标刻度线
#     tick_length => 4,                 # 控制刻度线长度,与long_ticks => 0, 配套使用
#     x_ticks           => 0, # 作用与long_ticks相同,限定X轴不显示刻度线,这样就只显示一条长刻度线
x_plot_values     => 1, # 默认为1,控制是否显示X轴刻度,如果设为0,则 x_ticks 属性将无效
y1_number_format    => sub { # from perlfaq5 # 控制坐标轴格式的子函数。
   local $_ = shift;
   1 while s/^([-+]?\d+)(\d{3})/$1,$2/; # 此为数字分隔效果:20,000
   $_;
},
y2_number_format    => sub { my $v = shift; sprintf("%.2f",$v/1024) }, # 控制坐标轴格式
# zero_axis_only      => 1, # 默认为0,当设为1时,将只画出0坐标轴,而不会在图的底部画轴,坐标也将在0轴上标注,都用于有正负值的图
# use_axis            => [1, 2, 2],       # 当有两个坐标轴但是有三个数据集的时候。
# 可以设定这三个数据集分别使用左右哪个坐标轴
# 同时图例要设置三个数据集颜色:dclrs => [qw(lgreen lred lred)],
legend_placement    => 'RT', # 图例位置


# bar选项
bar_spacing         => 1, # 同组柱间距
bargroup_spacing  => 10, # 柱组间距
shadow_depth     => 4, # 阴影宽度
accent_treshold  => 200, # 当bar的宽度大于此值时,bar的边缘会产生分界线,
# 如果想让图片效果连贯,则将此值设的比较大
show_values         => 1, # 在柱图上边标注数值
values_format       => "%3.2f", # 数值格式
#     cumulate         => 2, # bar图的另一种形式。显示为积累方式。比较多用于体现出增长的情况
# overwrite           => 1,  # 0:没有覆盖,普通柱图,两个bar平行。 1:两个bar相互覆盖。即在统一直线上 2:类似cumulate => 1的效果
  
  
   # 图例说明
   legend_placement    => 'RT', # 图例位置
   x_label_position    => 1/2,
  
   # 颜色选项
   bgclr      => 'white',
   fgclr               => 'white',
   boxclr              => 'dblue',
   accentclr           => 'dblue',
   valuesclr           => '#ffff77',
   dclrs               => [qw(lgreen lred)], # 设置数据集对应的颜色。设置为undef将隐藏该数据组
  
  
  
   logo                => 'zhong-ying.png',# logo 制作好的图片放在/usr/local/src/soft/GDGraph-1.44_01/t/images目录下
   logo_position       => 'BR',
  
   transparent         => 0, # 设定为1,背景色将变为透明色
  
   l_margin            => 10, # 各个边距
   b_margin            => 10,
   r_margin            => 10,
   t_margin            => 10,
  

  ) or warn $my_graph->error;

  
$my_graph->set(x_labels_vertical => 0, values_vertical => 0); # 横向图:横轴标签为水平,柱上数值为水平方式
$my_graph->set_legend('bottom axis', 'top axis'); # 设定图例内容 设置为undef将隐藏该图例
  

# 相关字体设置
  $my_graph->set_y_label_font('/shvpn/test/wlj/GD/SURSONG.TTF', 12); # Y轴说明
  $my_graph->set_x_label_font('/shvpn/test/wlj/GD/SURSONG.TTF', 12); # X轴说明
  $my_graph->set_y_axis_font('/shvpn/test/wlj/GD/SURSONG.TTF', 12); # Y轴坐标
  $my_graph->set_x_axis_font('/shvpn/test/wlj/GD/SURSONG.TTF', 12); # X轴坐标
  $my_graph->set_title_font('/shvpn/test/wlj/GD/SURSONG.TTF', 16); # 标题
  $my_graph->set_legend_font('/shvpn/test/wlj/GD/SURSONG.TTF', 14); # 图例
  $my_graph->set_values_font('/shvpn/test/wlj/GD/SURSONG.TTF', 12); # 数值



open(IMG, '>./tmpGDBar.png') or die $!;
print IMG $my_graph->plot($data)->png;
close IMG;

}

[ 本帖最后由 King_Leo 于 2008-3-11 20:09 编辑 ]


 mouse.rice 回复于:2008-03-07 15:40:29

顶起来!正需要。我最近也为绘图作报表烦恼,在GD绘图方面,望和兄弟多多交流,偶联系方式:
MSN:unix.linux@hotmail.com
QQ:370725724
多谢!


 hitsubunnu 回复于:2008-03-07 16:29:51

顶!


 gaochong 回复于:2008-03-07 17:40:04

和 gnuplot 有什么区别?


 redicaps 回复于:2008-03-07 19:50:05

赞:wink:


 chenzq1604 回复于:2008-03-11 13:00:08

不错不错,这个是好东东,要顶的


 nsnake 回复于:2008-03-11 15:10:48

赞一个的先!


 perljoker 回复于:2008-03-11 16:03:33

楼主,你发表的文章里面把左边那个“禁用smilies”点上……,这样好些,哈哈


 King_Leo 回复于:2008-03-11 20:10:42

引用:原帖由 perljoker 于 2008-3-11 16:03 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8065490&ptid=1062258]
楼主,你发表的文章里面把左边那个“禁用smilies”点上……,这样好些,哈哈 




接受批评。。。。哈哈


 nsnake 回复于:2008-03-13 15:40:25

很实用的东西


 nsnake 回复于:2008-03-13 16:08:34

win注意写入的时候要binmode下


 chenxiam 回复于:2008-03-14 21:56:46

这个要赞的,非常感谢LZ共享,这么好的东西,先收下了,真是谢谢了


 bilbo0214 回复于:2008-03-20 12:41:12

不错不错。要是LZ能把它做成一个pdf文件就好了。


 fouter 回复于:2008-03-20 16:25:52

顶一下,收藏了先




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=1062258
转载请注明作者名及原文出处