I'm using the module (described above) to create a "scrolling" line graph, useful tool if your looking at real-time data.
#!/usr/bin/perl -w
use strict;
use Gtk2 '-init';
use Glib qw/TRUE FALSE/;
use Gtk2::Ex::Graph::GD;
use GD::Graph::Data;
my $met_data1;
my $met_image1;
my $met_graph1;
my @utc;
my @temp;
my $utc = 00;
my $temp = 25.4;
my $pres = 1019.3;
my $rh1 = 20.0;
my $rh2 = 20.4;
my $timer_graph = Glib::Timeout->add(5000, \&graph);
&data_build;
Gtk2->main;
sub data_build {
my $data_window = Gtk2::Window->new('toplevel');
$data_window->signal_connect(delete_event=> sub{Gtk2->main_quit});
$data_window->set_title('Sonde Data');
$data_window->set_position('center');
$data_window->set_default_size(350,350);
my $data_table = Gtk2::Table->new(6,2,FALSE);
my $utc_label = Gtk2::Label->new("UTC");
my $utc_entry = Gtk2::Entry->new();
$utc_entry->set_editable(0);
my $temp_label = Gtk2::Label->new("Temperature");
my $temp_entry = Gtk2::Entry->new();
$temp_entry->set_editable(0);
my $pres_label = Gtk2::Label->new("Pressure");
my $pres_entry = Gtk2::Entry->new();
$pres_entry->set_editable(0);
my $rh1_label = Gtk2::Label->new("Relative Humidity(1)");
my $rh1_entry = Gtk2::Entry->new();
$rh1_entry->set_editable(0);
my $rh2_label = Gtk2::Label->new("Relative Humidity(2)");
my $rh2_entry = Gtk2::Entry->new();
$rh2_entry->set_editable(0);
#$met_data1 = GD::Graph::Data->new([
# [ 201002,201004,201006,201008,201010,201012],
# [ 0,10,20,30,40,50],
# [ 1000,975,950,925,920,910]
#]) or die GD::Graph::Data->error;
$met_data1 = GD::Graph::Data->new([
[ 0],
[ 0],
# [ 1100]
]) or die GD::Graph::Data->error;
$met_graph1 = Gtk2::Ex::Graph::GD->new(350, 200, 'lines');
$met_graph1->set(
x_label => 'UTC',
y1_label => 'Celcius',
y2_label => 'Millibars',
y1_max_value => 50,
y1_min_value => 0,
y2_max_value => 1100,
y2_min_value => 0,
y1_tick_number => 14,
y2_tick_number => 14,
two_axes => 2,
line_width => 3,
transparent => 0,
dclrs => [ qw(red blue) ],
x_label_position => 1/2,
);
$met_image1 = $met_graph1->get_image($met_data1);
$data_table->attach_defaults($utc_label,0,1,0,1);
$data_table->attach_defaults($utc_entry,1,2,0,1);
$data_table->attach_defaults($temp_label,0,1,1,2);
$data_table->attach_defaults($temp_entry,1,2,1,2);
$data_table->attach_defaults($pres_label,0,1,2,3);
$data_table->attach_defaults($pres_entry,1,2,2,3);
$data_table->attach_defaults($rh1_label,0,1,3,4);
$data_table->attach_defaults($rh1_entry,1,2,3,4);
$data_table->attach_defaults($rh2_label,0,1,4,5);
$data_table->attach_defaults($rh2_entry,1,2,4,5);
$data_table->attach_defaults($met_image1,0,2,5,6);
$data_window->add($data_table);
$data_window->show_all;
return 1;
}
sub graph{
my $utc_data;
my $temp_data;
my $count;
$utc = $utc + 5;
push(@utc,$utc);
my $length = @utc;
shift(@utc) if $length > 10;
#foreach my $kid(@utc) {
# $utc_data .= "$kid,";
#}
#chop $utc_data;
$temp = $temp - 0.05;
push(@temp,$temp);
$length = @temp;
shift(@temp) if $length > 10;
foreach my $kid(@temp) {
print "temp value $kid\n";
}
#chop $temp_data;
my $num = $met_data1->num_points();
if ($met_data1->num_points() == 10) {
for($count=0;$count<=$num-1;$count++) {
print "$count $temp[$count]\n";
$met_data1->set_x($count,$utc[$count]);
$met_data1->set_y(1,$count,$temp[$count]);
}
}else{
$met_data1->add_point($utc,$temp);
}
$num = $met_data1->num_points();
my @values = $met_data1->y_values(1);
foreach my $kid(@values) {
print "$num $kid\n";
}
#$pres = $pres - 3.2;
#$rh1 = $rh1 - 0.01;
#$rh2 = $rh2 - 0.012;
$met_image1 = $met_graph1->get_image($met_data1);
return 1;
}
So far it works good but when it goes to update the image all it does is overlay the new image top of the prior image, at least thats what I think it is doing. Any ideas?