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,
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
- Les meilleurs cours et tutoriels Perl et Perl 6 pour vous former ;
- FAQ Perl, Perl 6 et Perl/Tk d'entraide ;
- Les news sur la rubrique Perl ;
- S'abonner au compte Twitter de la rubrique Perl ;
- Mes tutoriels developpez.com.
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
Merci, je vais y regarder.
Que signifie :
# 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 : Sélectionner tout - Visualiser dans une fenêtre à part binmode $filehandle;
- Les meilleurs cours et tutoriels Perl et Perl 6 pour vous former ;
- FAQ Perl, Perl 6 et Perl/Tk d'entraide ;
- Les news sur la rubrique Perl ;
- S'abonner au compte Twitter de la rubrique Perl ;
- Mes tutoriels developpez.com.
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part my $im = new GD::Image($filehandle);
Ensuite :écrit sur la sortie standard, or tu souhaites écrire dans le fichier, donc ce sera
Code : Sélectionner tout - Visualiser dans une fenêtre à part print $im->png;
Ce qui te donne au final :
Code : Sélectionner tout - Visualiser dans une fenêtre à part print {$filehandle} $im->jpeg;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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;
- Les meilleurs cours et tutoriels Perl et Perl 6 pour vous former ;
- FAQ Perl, Perl 6 et Perl/Tk d'entraide ;
- Les news sur la rubrique Perl ;
- S'abonner au compte Twitter de la rubrique Perl ;
- Mes tutoriels developpez.com.
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
Merci, cela fonctionne. Je vais essayer de voir comment placer mes points maintenant.
Voici le type de graphique que j'aimerais obtenir :
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
Merci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 my $gd_objet = $graph->gd(); my $noir = $gd_objet->colorAllocate(0,0,0); $gd_objet->line($x1,$y1,$x2,$y2,$noir)
- Les meilleurs cours et tutoriels Perl et Perl 6 pour vous former ;
- FAQ Perl, Perl 6 et Perl/Tk d'entraide ;
- Les news sur la rubrique Perl ;
- S'abonner au compte Twitter de la rubrique Perl ;
- Mes tutoriels developpez.com.
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.
Problèmes résolus :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 my $data = GD::Graph::Data->new( [ [0..25], \@tag, ] );
Envoyé par Jasmine80
Code : Sélectionner tout - Visualiser dans une fenêtre à part $graph->set_legend( ( 'données du pyroséquenceur', $equation ) );
Partager