OVH Cloud OVH Cloud

axes avec GD::Graph

2 réponses
Avatar
Henri FRASSETTI
Bonjour,

J'utilise GD::Graph pour generer de jolie graphique.
Cela marche bien mais j'ai des axes en trait plein.
Est il possible d'avoir des axex en trait pointillé comme dans les graphique genere par RRD.

D'avance merci

2 réponses

Avatar
jl_morel
Dans l'article <dobuqs$aln$,
a dit...

J'utilise GD::Graph pour generer de jolie graphique.
Cela marche bien mais j'ai des axes en trait plein.
Est il possible d'avoir des axex en trait pointillé comme dans les graphique
genere par RRD.




Il n'y a pas d'option pour tracer les axes en pointillé.

La méthode qui trace les axes est draw_axes dans le module
GD::Graph::axestype.pm
Une solution est de récrire cette méthode. Comme il n'est pas recommandé de
le faire dans le module lui-même (ça peut poser des problèmes avec d'autres
programmes), on peut la récrire en tout début de script.

Dans le script démo qui suit j'utilise la méthode setStyle de GD pour fixer
le style des pointillés. Puis je remplace tous les $self->{fgci} par des
gdStyled. On ne peut pas faire un $self->{fgci} = gdStyled, car l'attribut
$self->{fgci} sert aussi pour les graduations et les graduations en
pointillé, c'est moche.

Une méthode plus rigoureuse serait d'écrire une classe GD::MyGraph dérivée
de GD::Graph et de surcharger les méthodes qu'on veut modifier. Mais c'est
un des avantages de Perl de permettre des raccourcis qui décoiffent :-)

#!/usr/bin/perl -w
use strict;
use GD;
use GD::Graph::lines;

# On redéfinit la routine draw_axes de GD::Graph::axestype.pm
# on aura le warning :
# Subroutine GD::Graph::axestype::draw_axes redefined at...
# c'est normal !

sub GD::Graph::axestype::draw_axes {
my $self = shift;

# def rouge en rgb
my $red = $self->{graph}->colorAllocate(255,0,0);
# Style du pointillé : 3 pixels rouges + 3 pixels transparents
$self->{graph}->setStyle($red, $red, $red,
gdTransparent, gdTransparent, gdTransparent
);

my ($l, $r, $b, $t) ( $self->{left}, $self->{right}, $self->{bottom}, $self->{top} );

# Sanity check for zero_axis and zero_axis_only
unless ($self->{y_min}[1] < 0 && $self->{y_max}[1] > 0) {
$self->{zero_axis} = 0;
$self->{zero_axis_only} = 0;
}

if ( $self->{box_axis} ) {
$self->{graph}->filledRectangle($l+1, $t+1, $r-1, $b-1, $self->{boxci})
if $self->{boxci};
$self->{graph}->rectangle($l, $t, $r, $b, gdStyled);
}
else {
$self->{graph}->line($l, $t, $l, $b, gdStyled);
$self->{graph}->line($l, $b, $r, $b, gdStyled)
unless ($self->{zero_axis_only});
$self->{graph}->line($r, $b, $r, $t, gdStyled)
if ($self->{two_axes});
}

if ($self->{zero_axis} or $self->{zero_axis_only}) {
my ($x, $y) = $self->val_to_pixel(0, 0, 1);
$self->{graph}->line($l, $y, $r, $y, gdStyled);
}

$self->_set_feature_coords("axes", "rect", $l, $b, $r, $t);
}

# ======| script de test (d'après la doc du module)

my @data = (
["1st","2nd","3rd","4th","5th","6th","7th", "8th", "9th"],
[ 1, 2, 5, 6, 3, 1.5, 1, 3, 4],
[ sort { $a <=> $b } (1, 2, 5, 6, 3, 1.5, 1, 3, 4) ]
);

my $graph = GD::Graph::lines->new(400, 300);

$graph->set(
box_axis => 0,
x_label => 'X Label',
y_label => 'Y label',
title => 'Some simple graph',
y_max_value => 8,
y_tick_number => 8,
y_label_skip => 2,
) or die $graph->error;

my $gd = $graph->plot(@data) or die $graph->error;

open(IMG, '>gdgraph.gif') or die $!;
binmode IMG;
print IMG $gd->gif;
close IMG;

__END__


--
J-L.M.
http://www.bribes.org/perl

Avatar
Henri FRASSETTI
Merci beaucoup

Je vais essayer



"Jean-Louis MOREL" a écrit dans le message de news: 43aa7dd1$0$21735$
Dans l'article <dobuqs$aln$,
a dit...

J'utilise GD::Graph pour generer de jolie graphique.
Cela marche bien mais j'ai des axes en trait plein.
Est il possible d'avoir des axex en trait pointillé comme dans les graphique
genere par RRD.




Il n'y a pas d'option pour tracer les axes en pointillé.

La méthode qui trace les axes est draw_axes dans le module
GD::Graph::axestype.pm
Une solution est de récrire cette méthode. Comme il n'est pas recommandé de
le faire dans le module lui-même (ça peut poser des problèmes avec d'autres
programmes), on peut la récrire en tout début de script.

Dans le script démo qui suit j'utilise la méthode setStyle de GD pour fixer
le style des pointillés. Puis je remplace tous les $self->{fgci} par des
gdStyled. On ne peut pas faire un $self->{fgci} = gdStyled, car l'attribut
$self->{fgci} sert aussi pour les graduations et les graduations en
pointillé, c'est moche.

Une méthode plus rigoureuse serait d'écrire une classe GD::MyGraph dérivée
de GD::Graph et de surcharger les méthodes qu'on veut modifier. Mais c'est
un des avantages de Perl de permettre des raccourcis qui décoiffent :-)

#!/usr/bin/perl -w
use strict;
use GD;
use GD::Graph::lines;

# On redéfinit la routine draw_axes de GD::Graph::axestype.pm
# on aura le warning :
# Subroutine GD::Graph::axestype::draw_axes redefined at...
# c'est normal !

sub GD::Graph::axestype::draw_axes {
my $self = shift;

# def rouge en rgb
my $red = $self->{graph}->colorAllocate(255,0,0);
# Style du pointillé : 3 pixels rouges + 3 pixels transparents
$self->{graph}->setStyle($red, $red, $red,
gdTransparent, gdTransparent, gdTransparent
);

my ($l, $r, $b, $t) > ( $self->{left}, $self->{right}, $self->{bottom}, $self->{top} );

# Sanity check for zero_axis and zero_axis_only
unless ($self->{y_min}[1] < 0 && $self->{y_max}[1] > 0) {
$self->{zero_axis} = 0;
$self->{zero_axis_only} = 0;
}

if ( $self->{box_axis} ) {
$self->{graph}->filledRectangle($l+1, $t+1, $r-1, $b-1, $self->{boxci})
if $self->{boxci};
$self->{graph}->rectangle($l, $t, $r, $b, gdStyled);
}
else {
$self->{graph}->line($l, $t, $l, $b, gdStyled);
$self->{graph}->line($l, $b, $r, $b, gdStyled)
unless ($self->{zero_axis_only});
$self->{graph}->line($r, $b, $r, $t, gdStyled)
if ($self->{two_axes});
}

if ($self->{zero_axis} or $self->{zero_axis_only}) {
my ($x, $y) = $self->val_to_pixel(0, 0, 1);
$self->{graph}->line($l, $y, $r, $y, gdStyled);
}

$self->_set_feature_coords("axes", "rect", $l, $b, $r, $t);
}

# ======| script de test (d'après la doc du module)

my @data = (
["1st","2nd","3rd","4th","5th","6th","7th", "8th", "9th"],
[ 1, 2, 5, 6, 3, 1.5, 1, 3, 4],
[ sort { $a <=> $b } (1, 2, 5, 6, 3, 1.5, 1, 3, 4) ]
);

my $graph = GD::Graph::lines->new(400, 300);

$graph->set(
box_axis => 0,
x_label => 'X Label',
y_label => 'Y label',
title => 'Some simple graph',
y_max_value => 8,
y_tick_number => 8,
y_label_skip => 2,
) or die $graph->error;

my $gd = $graph->plot(@data) or die $graph->error;

open(IMG, '>gdgraph.gif') or die $!;
binmode IMG;
print IMG $gd->gif;
close IMG;

__END__


--
J-L.M.
http://www.bribes.org/perl