[Perl]GD::Graph
时间:2006-10-16 来源:huhuegg
#!/usr/bin/perl
use CGI qw(:standard);
use DBI;
#use GD::Graph::lines;
use GD::Graph::linespoints; my $q= new CGI;
my $get_zoneid=$q->param('zoneid');
my $title="ZoneID:$get_zoneid CountryID:(LastUpdate_num/Last_30_min_MAX_num)";
my $lastmin=30;
my $dsn="DBI:mysql:number:192.168.1.1:3306";
my $db_user="db_user";
my $db_pass="db_pass";
my $dbh=DBI->connect($dsn,$db_user,$db_pass,{RaiseError=>1}); my $dates=`date --date "$lastmin minutes ago" +%Y-%m-%d" "%H":"%M":00"`;
chomp $dates;
my %country_max;
my %country_now;
my $max_y;
my @data;
my @xline;
my @y;
my $i=2;
while ($i <=12) {
&getdata($i);
$i=$i+1;
}
##400 600 800 1000 1200 1400 1600 1800 2000 2200 2400 2600 2800 3000
if ($max_y < 400 ) {
$max_y=400;
} elsif (($max_y>400) and ($max_y<600)) {
$max_y=600;
} elsif (($max_y>600) and ($max_y<800)) {
$max_y=800;
} elsif (($max_y>800) and ($max_y<1000)) {
$max_y=1000;
} elsif (($max_y>1000) and ($max_y<1200)) {
$max_y=1200;
} elsif (($max_y>1200) and ($max_y<1400)) {
$max_y=1400;
} elsif (($max_y>1400) and ($max_y<1600)) {
$max_y=1600;
} elsif (($max_y>1600) and ($max_y<1800)) {
$max_y=1800;
} elsif (($max_y>1800) and ($max_y<2000)) {
$max_y=2000;
} elsif (($max_y>2000) and ($max_y<2200)) {
$max_y=2200;
} elsif (($max_y>2200) and ($max_y<2400)) {
$max_y=2400;
} elsif (($max_y>2400) and ($max_y<2600)) {
$max_y=2600;
} elsif (($max_y>2600) and ($max_y<2800)) {
$max_y=2800;
} else {
$max_y=3000;
}
#$my_graph = new GD::Graph::lines(900,800);
$my_graph = new GD::Graph::linespoints(900,800); my $format = $my_graph->export_format;
print header("image/$format");
binmode STDOUT;
$my_graph->set(
x_label => 'time',
y_label => 'number',
title => $title,
y_max_value => $max_y,
y_min_value => 0,
y_tick_number => 20,
y_label_skip => 2,
box_axis => 1,
line_width => 1,
zero_axis_only => 1,
x_label_position => 1,
y_label_position => 1,
x_label_skip => 2,
x_tick_offset => 2, transparent => 0,
); $my_graph->set_legend("2($country_now{2}/$country_max{2})","3($country_now{3}/$country_max{3})","4($country_now{4}/$country_max{4})","5($country_now{5}/$country_max{5})","6($country_now{6}/$country_max{6})","7($country_now{7}/$country_max{7})","8($country_now{8}/$country_max{8})","9($country_now{9}/$country_max{9})","10($country_now{10}/$country_max{10})","11($country_now{11}/$country_max{11})","12($country_now{12}/$country_max{12})"); ##$my_graph->plot(\@data);
##save_chart($my_graph, 'out');
print $my_graph->plot(\@data)->$format(); #sub#
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;
}
sub getdata {
my ($countryid)=@_;
my @return_x;
my @return_y;
my $sth = $dbh->prepare("select datetimes,onlinenum from country where zoneid=$get_zoneid and datetimes>'$dates' and countryid=$countryid");
eval {
$sth->execute();
};
while (my @row = $sth->fetchrow_array) {
my($x,$y)=@row;
$x=substr($x,11,5);
push(@return_x,$x);
push(@return_y,$y);
}
if ($countryid==2) {
push(@data,\@return_x);
push(@data,\@return_y);
} else {
push(@data,\@return_y);
}
my $count=@return_y;
$country_now{$countryid}=$return_y[$count-1];
my @sortnum = sort {$b <=> $a} @return_y;
my $y_max=$sortnum[0];
$country_max{$countryid}=$y_max;
if ($y_max >= $max_y) {
$max_y=$y_max;
}
}
use CGI qw(:standard);
use DBI;
#use GD::Graph::lines;
use GD::Graph::linespoints; my $q= new CGI;
my $get_zoneid=$q->param('zoneid');
my $title="ZoneID:$get_zoneid CountryID:(LastUpdate_num/Last_30_min_MAX_num)";
my $lastmin=30;
my $dsn="DBI:mysql:number:192.168.1.1:3306";
my $db_user="db_user";
my $db_pass="db_pass";
my $dbh=DBI->connect($dsn,$db_user,$db_pass,{RaiseError=>1}); my $dates=`date --date "$lastmin minutes ago" +%Y-%m-%d" "%H":"%M":00"`;
chomp $dates;
my %country_max;
my %country_now;
my $max_y;
my @data;
my @xline;
my @y;
my $i=2;
while ($i <=12) {
&getdata($i);
$i=$i+1;
}
##400 600 800 1000 1200 1400 1600 1800 2000 2200 2400 2600 2800 3000
if ($max_y < 400 ) {
$max_y=400;
} elsif (($max_y>400) and ($max_y<600)) {
$max_y=600;
} elsif (($max_y>600) and ($max_y<800)) {
$max_y=800;
} elsif (($max_y>800) and ($max_y<1000)) {
$max_y=1000;
} elsif (($max_y>1000) and ($max_y<1200)) {
$max_y=1200;
} elsif (($max_y>1200) and ($max_y<1400)) {
$max_y=1400;
} elsif (($max_y>1400) and ($max_y<1600)) {
$max_y=1600;
} elsif (($max_y>1600) and ($max_y<1800)) {
$max_y=1800;
} elsif (($max_y>1800) and ($max_y<2000)) {
$max_y=2000;
} elsif (($max_y>2000) and ($max_y<2200)) {
$max_y=2200;
} elsif (($max_y>2200) and ($max_y<2400)) {
$max_y=2400;
} elsif (($max_y>2400) and ($max_y<2600)) {
$max_y=2600;
} elsif (($max_y>2600) and ($max_y<2800)) {
$max_y=2800;
} else {
$max_y=3000;
}
#$my_graph = new GD::Graph::lines(900,800);
$my_graph = new GD::Graph::linespoints(900,800); my $format = $my_graph->export_format;
print header("image/$format");
binmode STDOUT;
$my_graph->set(
x_label => 'time',
y_label => 'number',
title => $title,
y_max_value => $max_y,
y_min_value => 0,
y_tick_number => 20,
y_label_skip => 2,
box_axis => 1,
line_width => 1,
zero_axis_only => 1,
x_label_position => 1,
y_label_position => 1,
x_label_skip => 2,
x_tick_offset => 2, transparent => 0,
); $my_graph->set_legend("2($country_now{2}/$country_max{2})","3($country_now{3}/$country_max{3})","4($country_now{4}/$country_max{4})","5($country_now{5}/$country_max{5})","6($country_now{6}/$country_max{6})","7($country_now{7}/$country_max{7})","8($country_now{8}/$country_max{8})","9($country_now{9}/$country_max{9})","10($country_now{10}/$country_max{10})","11($country_now{11}/$country_max{11})","12($country_now{12}/$country_max{12})"); ##$my_graph->plot(\@data);
##save_chart($my_graph, 'out');
print $my_graph->plot(\@data)->$format(); #sub#
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;
}
sub getdata {
my ($countryid)=@_;
my @return_x;
my @return_y;
my $sth = $dbh->prepare("select datetimes,onlinenum from country where zoneid=$get_zoneid and datetimes>'$dates' and countryid=$countryid");
eval {
$sth->execute();
};
while (my @row = $sth->fetchrow_array) {
my($x,$y)=@row;
$x=substr($x,11,5);
push(@return_x,$x);
push(@return_y,$y);
}
if ($countryid==2) {
push(@data,\@return_x);
push(@data,\@return_y);
} else {
push(@data,\@return_y);
}
my $count=@return_y;
$country_now{$countryid}=$return_y[$count-1];
my @sortnum = sort {$b <=> $a} @return_y;
my $y_max=$sortnum[0];
$country_max{$countryid}=$y_max;
if ($y_max >= $max_y) {
$max_y=$y_max;
}
}
相关阅读 更多 +