• Publicidad

Generando gráficos con GD2 en Perl

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Generando gráficos con GD2 en Perl

Notapor andrea » 2009-07-29 12:25 @559

¡Hola!

Mi objetivo es generar gráficos de barra usando Perl. He leído el tutorial que habla acerca de eso, y estoy tratando de aplicar el ejemplo que aparece y no obtengo resultados. Instalé fink en mi Mac para bajar GD2, GD-lib y GD2-shlibs, corrí los ejemplos sin problema, pero el gráfico de barras no aparece como ejemplo. No he podido encontrar un tutorial de gráfico de barras para gd2. En su ejemplo usan GD, pero no sé si es diferente o solo una versión más antigua de GD2. Este es el error que me da:

Código: Seleccionar todo
Can't locate GD/Graph/bars.pm in @INC (@INC contains: /sw/lib/perl5 /sw/lib/perl5/darwin /System/Library/Perl/5.8.8/darwin-thread-multi-2level /System/Library/Perl/5.8.8 /Library/Perl/5.8.8/darwin-thread-multi-2level /Library/Perl/5.8.8 /Library/Perl /Network/Library/Perl/5.8.8/darwin-thread-multi-2level /Network/Library/Perl/5.8.8 /Network/Library/Perl /System/Library/Perl/Extras/5.8.8/darwin-thread-multi-2level /System/Library/Perl/Extras/5.8.8 /Library/Perl/5.8.6 /Library/Perl/5.8.1 .) at test2.pl line 4.


Por favor, cualquier ayudita es bienvenida...
¡¡¡Gracias miles!!!
Última edición por explorer el 2009-07-29 19:03 @835, editado 1 vez en total
Razón: Ortografía, bloques de código
andrea
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2007-07-27 16:29 @728

Publicidad

Re: Generando graficos con GD2 en Perl

Notapor netsoul » 2009-07-29 13:53 @620

Es posible que no tengas instalado el módulo GD::Graph::bars :D
Última edición por explorer el 2009-07-29 19:10 @840, editado 1 vez en total
With Perl
Imagination is more important than knowledge. Albert Einstein.
netsoul
Perlero nuevo
Perlero nuevo
 
Mensajes: 150
Registrado: 2008-05-04 01:11 @091

Re: Generando graficos con GD2 en Perl

Notapor andrea » 2009-07-29 14:08 @630

Hola a todos de nuevo,

Lo que pasa es que no me queda claro si GD2 es lo mismo que GD, o sea, creo al final usan GD.pm igual... bueno, si fuera así, los módulos deberían haber sido instalados cuando instalé GD2 y los otros dos requisitos.

GD2 está funcionando bien en mi Mac, de manera que solo quisiera un ejemplo de cómo hacer gráfico de barras usando GD2. Ojalá no parezca muy complicado de leer :?

Mi objetivo final es solo hacer gráficos con Perl, y me está tomando muuuucho tiempo, please, una ayudita...

¡Gracias!
Última edición por explorer el 2009-07-29 19:05 @837, editado 1 vez en total
Razón: Ortografía
andrea
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2007-07-27 16:29 @728

Re: Generando gráficos con GD2 en Perl

Notapor explorer » 2009-07-29 19:43 @863

GD2 se refiere a la versión de v2 de la librería GD, hecha por Thomas Boutell.

La interfaz Perl para esa librería es el módulo GD.pm, escrita por Lincoln D. Stein.

Lo que pasa es que manejar la librería GD directamente, puede ser muy pesado. Por eso aparecieron módulos como el GD::Graph.

Yo tengo por estos foros un ejemplo con GD::Graph::Points, pero que es fácil de llevar a ::bars.

Y he localizado otro ejemplo con ::bars.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Generando gráficos con GD2 en Perl

Notapor andrea » 2009-08-05 12:45 @573

Muchas gracias, explorer... eso era lo que necesitaba... Ahora ya estoy obteniendo mis gráficos sin problemas.

Lo que quisiera ahora es que mi código, con el cual genero los datos que se van a graficar, se aplique a todos los archivos que requiero, por ejemplo a todos los archivos que tienen este formato: *.txt. Intenté correr mi código así:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. perl file.pl *.txt 


Pero solo me genera los gráficos del primer archivo que encuentra y no continua trabajando sobre el resto. ¿Cómo puedo hacer que mi código se aplique sobre todos los archivos *.txt?

Gracias de nuevo,
:D
andrea
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2007-07-27 16:29 @728

Re: Generando gráficos con GD2 en Perl

Notapor preiddy » 2009-08-05 13:04 @586

Una vez hice esto. Sé que no es lo mejor pero me sirvió de mucho.

En un archivo nuevo, por ejemplo crear_graficos.pl:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while ( $txt = <*.txt> ) {
        system("perl file.pl $txt");
}
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4
preiddy
Perlero nuevo
Perlero nuevo
 
Mensajes: 70
Registrado: 2006-03-29 05:43 @280
Ubicación: Madrid, España

Re: Generando gráficos con GD2 en Perl

Notapor andrea » 2009-08-05 13:09 @590

Gracias, preiddy, ¡¡¡funciona perfecto!!!

:D
andrea
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2007-07-27 16:29 @728

Re: Generando gráficos con GD2 en Perl

Notapor explorer » 2009-08-05 14:46 @657

andrea escribiste:Intenté correr mi código así:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. perl file.pl *.txt 

Pero sólo me genera los gráficos del primer archivo que encuentra y no continua trabajando sobre el resto. ¿Cómo puedo hacer que mi código se aplique sobre todos los archivos *.txt?


Pues que no te funciones puede depender del sistema operativo: si están en Windows, por defecto, el '*.txt' no es expandido, como sí ocurre en Linux/UNIX.

Distribuciones Perl para Windows suelen traer un programa que realiza esa tarea, por ejemplo, en ActiveState, viene el programa llamado Perl/bin/perlglob.bat.

Si, en cambio, estás en Linux/UNIX, entonces tienes un problema. Lo mejor es publicar el código que falla, para que intentemos ayudarte.

En cuanto a la solución de preiddy, mi dicho es: si estás usando Perl dentro de Perl, es que lo estás haciendo mal. :lol:
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Generando gráficos con GD2 en Perl

Notapor andrea » 2009-08-05 15:02 @668

Ok, acá va mi siguiente duda:

Mi objetivo final es graficar dos o más grupos de datos en un mismo gráfico de barras.

Tengo una serie de archivos: file1.txt, file2.txt, etc. desde los cuales extraigo la información para ser graficada y hasta ahora puedo graficarlos individualmente, de manera que obtengo por ejemplo file1.png, file2.png. El asunto es que me gustaría poder crear gráficos de barras con 2 o más grupos de datos a la vez.

Recién he visto tu mensaje, explorer... acá adjunto mi código... ¡y gracias desde ya!

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. use warnings;
  3. use strict;
  4. use GD::Graph::bars;
  5.  
  6. #-----------------------------------
  7. #Calculo de frecuencias
  8.  
  9. open(FILE,"$ARGV[0]") || die "File not found\n";
  10. my  ($file)= $ARGV[0] =~ /^(.*?)\_TE.txt*$/;
  11. my @lines = <FILE>;
  12. close(FILE);
  13.  
  14. my $c1  = 0; my $c2 =  0; my $c3  = 0; my $c4  = 0;
  15. my $c5  = 0; my $c6 =  0; my $c7  = 0; my $c8  = 0;
  16. my $c9  = 0; my $c10 = 0; my $c11 = 0; my $c12 = 0;
  17. my $c13 = 0; my $c14 = 0; my $c15 = 0; my $c16 = 0;
  18. my $c17 = 0; my $c18 = 0; my $c19 = 0; my $c20 = 0;
  19. my $c21 = 0; my $c22 = 0; my $c23 = 0; my $c24 = 0;
  20. my $c25 = 0; my $c26 = 0; my $c27 = 0; my $c28 = 0;
  21.  
  22. foreach my $line (@lines) {
  23.     my ($dG) = $line =~ /^.*?\s\d+\s+(\d+.\d+)\s.*$/;
  24.     #print "$dG\n ";
  25.     next if ! $dG;
  26.     my ($lnK) = ($dG)/-(1.9872*298.15);
  27.     #print "$lnK\n";
  28.  
  29.     if ( $lnK < -26) { $c1++; }
  30.     if (-26 <= $lnK && $lnK < -25) {$c2++;}
  31. if (-25 <= $lnK && $lnK < -24) {$c3++;}
  32. if (-24 <= $lnK && $lnK < -23) {$c4++;}
  33. if (-23 <= $lnK && $lnK < -22) {$c5++;}
  34. if (-22 <= $lnK && $lnK < -21) {$c6++;}
  35. if (-21 <= $lnK && $lnK < -20) {$c7++;}
  36. if (-20 <= $lnK && $lnK < -19) {$c8++;}
  37. if (-19 <= $lnK && $lnK < -18) {$c9++;}
  38. if (-18 <= $lnK && $lnK < -17) {$c10++;}
  39. if (-17 <= $lnK && $lnK < -16) {$c11++;}
  40. if (-16 <= $lnK && $lnK < -15) {$c12++;}
  41. if (-15 <= $lnK && $lnK < -14) {$c13++;}
  42. if (-14 <= $lnK && $lnK < -13) {$c14++;}
  43. if (-13 <= $lnK && $lnK < -12) {$c15++;}
  44. if (-12 <= $lnK && $lnK < -11) {$c16++;}
  45. if (-11 <= $lnK && $lnK < -10) {$c17++;}
  46. if (-10 <= $lnK && $lnK < -9) {$c18++;}
  47. if (-9 <= $lnK && $lnK < -8) {$c19++;}
  48. if (-8 <= $lnK && $lnK < -7) {$c20++;}
  49. if (-7 <= $lnK && $lnK < -6) {$c21++;}
  50. if (-6 <= $lnK && $lnK < -5) {$c22++;}
  51. if (-5 <= $lnK && $lnK < -4) {$c23++;}
  52. if (-4 <= $lnK && $lnK < -3) {$c24++;}
  53. if (-3 <= $lnK && $lnK < -2) {$c25++;}
  54. if (-2 <= $lnK && $lnK < -1) {$c26++;}
  55. if (-1 <= $lnK && $lnK < 0) {$c27++;}
  56. if (0 <= $lnK ) {$c28++;}
  57. }
  58. # print "$c1,$c2,$c3,$c4,$c5,$c6,$c7,$c8,$c9,$c10,$c11,$c12,$c13,$c14,$c15,$c16,$c17,$c18,$c19,$c20,$c21,$c22,$c23,$c24,$c25,$c26,$c27,$c28\n";
  59.  
  60. #Generando gráfico Frecuencia vs lnK
  61.  
  62. my @freq2 = ($c1,$c2,$c3,$c4,$c5,$c6,$c7,$c8,
  63. $c9,$c10,$c11,$c12,$c13,$c14,$c15,$c16,
  64. $c17,$c18,$c19,$c20,$c21,$c22,$c23,$c24,
  65. $c25,$c26,$c27,$c28);
  66.  
  67. my @lnK = ( '[<-26]','[-26,-25]','[-25,-24]','[-24,-23]','[-23,-22]','[-22,-21]','[-21,-20]','[-20,-19]','[-19,-18]','[-18,-17]','[-17,-16]','[-16,-15]','[-15,-14]','[-14,-13]','[-13,-12]','[-12,-11]','[-11,-10]','[-10,-9]','[-9,-8]','[-8,-7]','[-7,-6]','[-6,-5]','[-5,-4]','[-4,-3]','[-3,-2]','[-2,-1]','[-1,0]','[>=0]');
  68.  
  69. my @graf2 = (\@lnK, \@freq2);
  70.  
  71. my $grafico2 =  GD::Graph::bars->new(1500, 400);
  72. $grafico2->set_legend("$file" );
  73. $grafico2->set(
  74.         x_label => 'lnK',
  75.         y_label => 'Frequency',
  76.         title => "$file",
  77.         # shadows
  78.             bar_spacing     => 8,
  79.             shadow_depth    => 4,
  80.             shadowclr       => 'dred',
  81.             transparent     => 0,
  82.                
  83. )
  84.  or warn $grafico2->error;
  85.  
  86. my $imagen2 = $grafico2->plot(\@graf2) or die $grafico2->error;
  87.  
  88. open (OUT, "> $file-lnK.png") or die "couldn't open histo_file.png: $!";
  89.  
  90. #print "Content-type: image/png\n\n";
  91. print OUT $imagen2->png;
  92.  
  93. exit;
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
andrea
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2007-07-27 16:29 @728

Re: Generando gráficos con GD2 en Perl

Notapor explorer » 2009-08-09 14:29 @645

Te recomiendo que consultes la carpeta de ejemplos de GDGraph. Me parece que el que necesitas repasar es el número 71.

Y otra cosa, hacer esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $c1  = 0; my $c2 =  0; my $c3  = 0; my $c4  = 0;
my $c5  = 0; my $c6 =  0; my $c7  = 0; my $c8  = 0;
my $c9  = 0; my $c10 = 0; my $c11 = 0; my $c12 = 0;
my $c13 = 0; my $c14 = 0; my $c15 = 0; my $c16 = 0;
my $c17 = 0; my $c18 = 0; my $c19 = 0; my $c20 = 0;
my $c21 = 0; my $c22 = 0; my $c23 = 0; my $c24 = 0;
my $c25 = 0; my $c26 = 0; my $c27 = 0; my $c28 = 0;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

No es necesario.

Recuerda: si estás escribiendo mucho en un programa, es que estás haciendo algo mal. Si estás repitiendo algo mucho, seguro que se puede hacer de otra forma mucho más cómoda.

Las 28 sentencias crean 28 variables, y más tarde haces esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @freq2 = ($c1,$c2,$c3,$c4,$c5,$c6,$c7,$c8,
$c9,$c10,$c11,$c12,$c13,$c14,$c15,$c16,
$c17,$c18,$c19,$c20,$c21,$c22,$c23,$c24,
$c25,$c26,$c27,$c28);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Lo ves? En realidad, puedes hacer todo el trabajo con la variable @freq2.

Aún más, el incremento de esas variables según el valor que obtenga la variable $lnK, se puede realizar más abreviadamente (y rápida) con un poco de matemáticas.

Si el valor de $lnK es menor de -26, se incrementa la primera variable.
Si el valor de $lnK está entre -26 y 0, se incrementan 26 variables.
Si el valor de $lnK es igual o superior a 0, se incrementa la última variable.

Esto lo puedes conseguir con una sencilla suma y 3 condiciones (no 28):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
for my $lnK(-30 .. 3) {
    print "$lnK\t";

    if ($lnK < -26) {
        print "1\n";
    }
    elsif ($lnK > 0) {
        print "28\n";
    }
    else {
        print 28+$lnK, "\n";
    }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Incluso la línea 67 la puedes escribir de forma más clara así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @lnK =
  2. (   '[<-26]'
  3. ,   (map { '[' . $_ . ',' . ($_-1) .']' } -26 .. -1)
  4. ,   '[>=0]'
  5. );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Bueno, sí, quizás sea excesivo el reducirlo tanto, pero tiene la ventaja de que luego es fácil de cambiar si el rango de valores cambia.

El programa queda un poco más corto y claro. Y genera la misma salida, salvo por un detalle: los valores 0 no son "sombreados".

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. use GD::Graph::bars;
  6.  
  7. #-----------------------------------
  8. # Cálculo de frecuencias
  9. #-----------------------------------
  10.  
  11. ## Parámetro
  12. @ARGV or die "ERROR: Se debe indicar el fichero *_TE.txt a procesar.\n";
  13. my $fichero = shift @ARGV;
  14.  
  15. ## Identificador del fichero
  16. my ($file) = $fichero =~ /^(.*)\_TE\.txt/;
  17. "$file" or die "ERROR: No soy capaz de sacar el identificador del fichero $fichero.\n";
  18.  
  19. ## Lectura del fichero y estadísticas
  20. my @freq2;
  21.  
  22. open(FILE,"<$fichero") or die "ERROR al abrir $fichero: $!\n";
  23.  
  24. my $cabecera = <FILE>;
  25.  
  26. while (my $line = <FILE>) {
  27.     # MET 1    6934.885   -1551.679       99.356    -6600.487      1
  28.     my @campos = split " ", $line;
  29.     my $dGprom = $campos[2];
  30.     my $lnK    = $dGprom / (-1.9872 * 298.15);
  31.  
  32.     if    ($lnK < -26) {
  33.                         $freq2[0      ]++;
  34.     }
  35.     elsif ($lnK >   0) {
  36.                         $freq2[27     ]++;
  37.     }
  38.     else {
  39.                         $freq2[27+$lnK]++;
  40.     }
  41. }
  42.  
  43. close(FILE);
  44.  
  45. ## Generando gráfico Frecuencia vs lnK
  46. my @lnK =
  47. (   '[<-26]'
  48. ,   (map { '[' . $_ . ',' . ($_-1) .']' } -26 .. -1)
  49. ,   '[>=0]'
  50. );
  51.  
  52. my $grafico2 =  GD::Graph::bars->new(1500, 400);
  53. $grafico2->set_legend("$file" );
  54. $grafico2->set(
  55.         x_label => 'lnK',
  56.         y_label => 'Frequency',
  57.         title => "$file",
  58.         # shadows
  59.             bar_spacing     => 8,
  60.             shadow_depth    => 4,
  61.             shadowclr       => 'dred',
  62.             transparent     => 0,
  63.  
  64. )
  65. or warn $grafico2->error;
  66.  
  67. my $imagen2 = $grafico2->plot([\@lnK, \@freq2]) or die $grafico2->error;
  68.  
  69. open (OUT, "> $file-lnK.png") or die "couldn't open histo_file.png: $!";
  70. print OUT $imagen2->png;
  71. close OUT;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Bueno, esto es una forma, pero Perl te permite hacerlo de muchas otras. :)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron