Bonjour,
J'aimerais faire un simple graphique 2D en perl. J'ai donc une série de valeurs (x, y). Quels modules me conseillez-vous? J'avais pensé à un fichier de sortie excel, mais ça peu-être sous une autre forme.
Merci,
Version imprimable
Bonjour,
J'aimerais faire un simple graphique 2D en perl. J'ai donc une série de valeurs (x, y). Quels modules me conseillez-vous? J'avais pensé à un fichier de sortie excel, mais ça peu-être sous une autre forme.
Merci,
Le module GD
Merci, je vais y regarder.
Que signifie :
Citation:
# make sure we are writing to a binary stream
binmode STDOUT;
Quand tu créeras ton image, il ne faudra pas oublier de fairehistoire de bien créer ton fichier binaire.Code:binmode $filehandle;
J'ai essayé de créer un graphique à partir du script du CPAN mais je n'arrive pas à écrire dans le fichier de sortie.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 #!/usr/local/bin/perl #------------- GD.pl use strict; use warnings; use FileHandle; # Interface to Gd Graphics Library use GD; # create a new image my $filehandle = FileHandle->new(">P:/Theorie/Cathy/Myco_pyro/test.jpg") or die; # make sure we are writing to a binary stream binmode $filehandle; my $im = new GD::Image($filehandle); # allocate some colors my $white = $im->colorAllocate(255,255,255); my $black = $im->colorAllocate(0,0,0); my $red = $im->colorAllocate(255,0,0); my $blue = $im->colorAllocate(0,0,255); # make the background transparent and interlaced $im->transparent($white); $im->interlaced('true'); # Put a black frame around the picture $im->rectangle(0,0,99,99,$black); # Draw a blue oval $im->arc(50,50,95,75,0,360,$blue); # And fill it with red $im->fill(50,50,$red); # Convert the image to PNG and print it on standard output print $im->png;
Comment faire afin de donner mes coordonnées (x,y) et pour y faire passer une droite de régression? Ce module le permet-il, ou doit-on le combiner à un autre?
Merci pour votre aide,
Regression.pm - weighted linear regression package (line+plane fitting)
Ou qui parait plus simple :
Statistics::LineFit - Least squares line fit, weighted or unweighted
J'aimerais faire un premier graphique afin de voir l'aspect général en espérant que ce sera une droite mais ce sera plus probablement une courbe.
Lit bien la documentation.
Dans le constructeur, tu ne dois pas mettre le filehandle, mais plutôt la dimension de ton image.Code:my $im = new GD::Image($filehandle);
Ensuite :écrit sur la sortie standard, or tu souhaites écrire dans le fichier, donc ce seraCode:print $im->png;
Ce qui te donne au final :Code:print {$filehandle} $im->jpeg;
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 #!/usr/local/bin/perl #------------- GD.pl use strict; use warnings; use FileHandle; # Interface to Gd Graphics Library use GD; # create a new image my $filehandle = FileHandle->new(">P:/Theorie/Cathy/Myco_pyro/test.jpg") or die; # make sure we are writing to a binary stream binmode $filehandle; my $im = new GD::Image(300,300); # allocate some colors my $white = $im->colorAllocate(255,255,255); my $black = $im->colorAllocate(0,0,0); my $red = $im->colorAllocate(255,0,0); my $blue = $im->colorAllocate(0,0,255); # make the background transparent and interlaced $im->transparent($white); $im->interlaced('true'); # Put a black frame around the picture $im->rectangle(0,0,99,99,$black); # Draw a blue oval $im->arc(50,50,95,75,0,360,$blue); # And fill it with red $im->fill(50,50,$red); # Convert the image to PNG and print it on standard output print {$filehandle} $im->jpeg;
Merci, cela fonctionne. Je vais essayer de voir comment placer mes points maintenant.
Voici le type de graphique que j'aimerais obtenir :
http://img41.imageshack.us/img41/397/graphrj.png
Voici mon code
Comment ajouter une droite de régression? Calculer R2? Est-il possible d'associer sur le graphique une lettre à chaque point?Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 #!/usr/local/bin/perl #------------- GD.pl use strict; use warnings; use Statistics::Lite qw(:all); use GD::Graph::lines; =h Rapport 1 A1 Nuc 0 12.33 T 1 13.53 C 2 13.49 T 4 14.22 A 6 12.89 T 7 13.04 C 8 11.81 T 10 11.23 G 12 13.44 C 16 13.29 C 21 13.2 G 23 11.85 C 24 11.45 T 25 11.14 G =cut my @data = ( [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25], [12.33, 13.53, 13.49, undef, 14.22, undef, 12.89, 13.04, 11.81, undef, 11.23, undef, 13.44, undef, undef, undef, 13.29, undef, undef, undef, undef, 13.2, undef, 11.85, 11.45,11.14], ); # x dont le y n'est pas défini : 3, 5, 9, 11, 13, 14, 15, 17, 18, 19, 20, 22 # lettre à associer à chaque point défini my @tag = ('T', 'C', 'T', 'A', 'T', 'C', 'T', 'G', 'C', 'C', 'G', 'C', 'T', 'G'); my $graph = GD::Graph::lines->new(600, 300); $graph->set( x_label => 'positions', y_label => 'valeurs', title => 'Evolution du signal des pics uniques au cours du pyroséquençage', y_max_value => 16, y_tick_number => 8, y_label_skip => 2 ) or die $graph->error; my $gd = $graph->plot(\@data) or die $graph->error; open(IMG, '>P:/Theorie/Cathy/Myco_pyro/graphiques/Rap1_A1.jpg') or die $!; binmode IMG; print IMG $gd->png;
Merci,
Voici la dernière version du script : j'ai calculé l'équation de la droite et le R carré, comment l'afficher sur le graphique
MerciCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90 #!/usr/local/bin/perl #------------- GD_line.pl use strict; use warnings; use GD::Graph::lines; use Statistics::LineFit; =h Rapport 1 A1 Nuc 0 12.33 T 1 13.53 C 2 13.49 T 4 14.22 A 6 12.89 T 7 13.04 C 8 11.81 T 10 11.23 G 12 13.44 C 16 13.29 C 21 13.2 G 23 11.85 C 24 11.45 T 25 11.14 G =cut my $report = 1; my $run = 'A1'; # recherche de l'équation de la droite my $lineFit = Statistics::LineFit->new(); my @unic_val_position_x = (0, 1, 2, 4, 6, 7, 8, 10, 12, 16, 21, 23, 24, 25); my @unic_val_y = (12.33, 13.53, 13.49, 14.22, 12.89, 13.04, 11.81, 11.23, 13.44, 13.29, 13.20, 11.85, 11.45, 11.14); $lineFit->setData (\@unic_val_position_x, \@unic_val_y) or die "Invalid data"; my ($intercept, $slope) = $lineFit->coefficients(); my $rSquared = sprintf ( "%.3f",$lineFit->rSquared()); # valeurs des points mis sur le graphique my @y_values_graph = (12.33, 13.53, 13.49, undef, 14.22, undef, 12.89, 13.04, 11.81, undef, 11.23, undef, 13.44, undef, undef, undef, 13.29, undef, undef, undef, undef, 13.20, undef, 11.85, 11.45, 11.14); # lettre à associer à chaque point défini my @tag = ('T', 'C', 'T', undef, 'A',undef, 'T', 'C', 'T', undef, 'G', undef, 'C', undef, undef, undef, 'C', undef, undef, undef, undef, 'G', undef, 'C', 'T', 'G'); my @data = ( [0..25], \@y_values_graph, ); # x dont le y n'est pas défini : 3, 5, 9, 11, 13, 14, 15, 17, 18, 19, 20, 22 my $graph = GD::Graph::lines->new(650, 300); $graph->set( x_label => 'positions', y_label => 'valeurs', title => "Rap. $report $run : Evolution du signal des pics uniques au cours du pyroséquençage", y_max_value => 16, y_tick_number => 8, y_label_skip => 2 ) or die $graph->error; $graph -> set(dclrs => ["dgreen"]); my $gd = $graph->plot(\@data) or die $graph->error; if ($intercept >= 0){ print "Y = $slope X +$intercept\nR2 = $rSquared\n"; } else { print "Y = $slope X $intercept\nR2 = $rSquared\n"; } open(IMG, ">P:/Theorie/Cathy/Myco_pyro/graphiques/Rap${report}_$run.jpg") or die $!; binmode IMG; print IMG $gd->png;
Tu peux récupérer l'objet gd ainsi et ensuite dessiner ta ligne
Code:
1
2
3 my $gd_objet = $graph->gd(); my $noir = $gd_objet->colorAllocate(0,0,0); $gd_objet->line($x1,$y1,$x2,$y2,$noir)
La ligne se dessine dans le coin supérieur gauche du cadre, à gauche du titre, et en dehors de la zone du graphique. Vu que mon cadre est de GD::Graph::lines->new(650, 300), comment puis-je adapter la ligne?Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101 #!/usr/local/bin/perl #------------- GD_line.pl use strict; use warnings; use GD::Graph::lines; use Statistics::LineFit; =h Rapport 1 A1 Nuc 0 12.33 T 1 13.53 C 2 13.49 T 4 14.22 A 6 12.89 T 7 13.04 C 8 11.81 T 10 11.23 G 12 13.44 C 16 13.29 C 21 13.2 G 23 11.85 C 24 11.45 T 25 11.14 G =cut my $report = 1; my $run = 'A1'; # recherche de l'équation de la droite my $lineFit = Statistics::LineFit->new(); my @unic_val_position_x = (0, 1, 2, 4, 6, 7, 8, 10, 12, 16, 21, 23, 24, 25); my @unic_val_y = (12.33, 13.53, 13.49, 14.22, 12.89, 13.04, 11.81, 11.23, 13.44, 13.29, 13.20, 11.85, 11.45, 11.14); $lineFit->setData (\@unic_val_position_x, \@unic_val_y) or die "Invalid data"; my ($intercept, $slope) = $lineFit->coefficients(); my $rSquared = sprintf ( "%.3f",$lineFit->rSquared()); # valeurs des points mis sur le graphique my @y_values_graph = (12.33, 13.53, 13.49, undef, 14.22, undef, 12.89, 13.04, 11.81, undef, 11.23, undef, 13.44, undef, undef, undef, 13.29, undef, undef, undef, undef, 13.20, undef, 11.85, 11.45, 11.14); # lettre à associer à chaque point défini my @tag = ('T', 'C', 'T', undef, 'A',undef, 'T', 'C', 'T', undef, 'G', undef, 'C', undef, undef, undef, 'C', undef, undef, undef, undef, 'G', undef, 'C', 'T', 'G'); my @data = ( [0..25], \@y_values_graph, ); # x dont le y n'est pas défini : 3, 5, 9, 11, 13, 14, 15, 17, 18, 19, 20, 22 my $graph = GD::Graph::lines->new(650, 300); $graph->set( x_label => 'positions', y_label => 'valeurs', title => "Rap. $report $run : Evolution du signal des pics uniques au cours du pyroséquençage", y_max_value => 16, y_tick_number => 8, y_label_skip => 2 ) or die $graph->error; $graph -> set(dclrs => ["dgreen"]); my $gd = $graph->plot(\@data) or die $graph->error; if ($intercept >= 0){ print "Y = $slope X +$intercept\nR2 = $rSquared\n"; } else { print "Y = $slope X $intercept\nR2 = $rSquared\n"; } # dessin de la droite sur le graphique my $gd_objet = $graph->gd(); my $rouge = $gd_objet->colorAllocate(255,0,0); my $x1 = 0; my $y1 = $intercept; my $x2 = 25; my $y2 = $slope * 25 + $intercept; $gd_objet->line($x1,$y1,$x2,$y2,$rouge); open(IMG, ">P:/Theorie/Cathy/Myco_pyro/graphiques/Rap${report}_$run.jpg") or die $!; binmode IMG; print IMG $gd->png;
Et n'y a-t-il pas moyen d'écrire une lettre à côté de chaque point sur le graph?
Merci pour ton aide.