GD::Graph模块的一点总结,希望能有人需要
King_Leo
|
1#
King_Leo 发表于 2008-03-07 15:32
GD::Graph模块的一点总结,希望能有人需要
换工作了,平时也没少得到办理朋友的帮助
这些东西是我最近总结的,主要是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; ============================================================= ============================================================= |