Re: Gráficas MRTG
> Hola Lista.
>
> Sabeis si se puede y como se hace para que el MRTG pueda realizar una
> gráfica a partir de un txt separado por comas y/o espacios?
MRTG está hecho para samplear datos recibiendo cada vez un valor alto y un
valor bajo. Si puedes alimentarle estos datos en ese formato (p.ej. a
través de un programita simplón en Perl), quedas listo.
Ahora, tal vez te convendría directamente desde Perl (o tu lenguaje
favorito) crear la gráfica. Es muy simple - Te pongo por ejemplo el código
que generó estas gráficas:
http://tlali.iztacala.unam.mx/elec/distrib/
Lo hice con GD (y obviamente, en Perl), y fue mayormente para aprender a
usar GD, así que... Tal vez haya código feo y muy mejorable por todos
lados ;-)
=======================================================
sub grafBarras {
# Recibe dos parámetros - el primero es una referencia a un arreglo, el
# segundo es una referencia a un hash. Crea una gráfica de barras en la
# que el arreglo queda como eje X. Cada columna va referida a uno de
# estos valores.
# Regresa el PNG generado por la información recibida.
my ($img, $col, $colBarras, $elec, $dist, $max, $x, $y, $tot);
$dist->{'columnas'} = shift;
$dist->{'cant'} = shift;
$x = shift;
$y = shift;
$img = new GD::Image($x,$y);
$col = {'blanco' => $img->colorAllocate(255,255,255),
'negro' => $img->colorAllocate(0,0,0),
'gris' => $img->colorAllocate(180,180,180),
'azul_univ' => $img->colorAllocate(5,42,92),
'amarillo_oro' => $img->colorAllocate(238,180,2),
'terracota' => $img->colorAllocate(90,2,2),
'verde' => $img->colorAllocate(2,98,14),
'cobre' => $img->colorAllocate(197,82,5) };
$colBarras = [qw(azul_univ amarillo_oro terracota verde cobre)];
$img->rectangle(0,0,$x-1,$y-1,$col->{'negro'});
$tot = 0;
map {$tot += $dist->{'cant'}{$dist->{'columnas'}[$_]}} (@{$dist->{'columnas'}});
return $img->png unless scalar @{$dist->{'columnas'}};
$dist->{'dim'} = [ $x*.05, # Valor mínimo horizontal
$x*.95, # Valor máximo horizontal
$y*.05, # Valor mínimo vertical
$y*.76, # Valor máximo vertical, primer renglón de etiquetas
$y*.84, # Segundo renglón de etiquetas
$y*.88, # tercer renglón de etiquetas
($x*0.9)/(scalar @{$dist->{'columnas'}}), # Espacio entre columnas
$x/(@{$dist->{'columnas'}}*3) # Ancho de cada columna
];
foreach my $lin (0..6) {
# Líneas guía de fondo
my $xpos = ($dist->{'dim'}[1]-$dist->{'dim'}[0]) * ($lin/6) + $dist->{'dim'}[0];
my $ypos = ($dist->{'dim'}[3]-$dist->{'dim'}[2]) * ($lin/6) + $dist->{'dim'}[2];
$img->line($dist->{'dim'}[0],$ypos,$dist->{'dim'}[1],$ypos,$col->{'gris'});
$img->line($xpos,$dist->{'dim'}[2],$xpos,$dist->{'dim'}[3],$col->{'gris'});
}
$max=0;
foreach (values %{$dist->{'cant'}}) {
$max = $_ if $max < $_;
}
foreach my $colum (0..$#{$dist->{'columnas'}}) {
# Cada una de las barras, así como los números que las describen
my ($posX, $vot, $altura, $altMax);
$posX = $dist->{'dim'}[0] + ($colum+.5) * $dist->{'dim'}[6];
$vot = $dist->{'cant'}{$dist->{'columnas'}[$colum]};
$altMax = $dist->{'dim'}[3] - $dist->{'dim'}[2];
$altura = $dist->{'dim'}[2] + $altMax - ($max ? $vot/$max : 0) * $altMax;
$img->string(GD::Font->Small, $posX, $dist->{'dim'}[3], $vot, $col->{$colBarras->[$colum % @$colBarras]});
$img->string(GD::Font->Tiny, $posX, $dist->{'dim'}[4], sprintf('%d%%',($vot*100)/$tot), $col->{$colBarras->[$colum % @$colBarras]});
$img->string(GD::Font->Small, $posX, $dist->{'dim'}[5], $dist->{'columnas'}[$colum], $col->{'negro'});
$img->filledRectangle($posX-($dist->{'dim'}[7]/2), $altura, $posX+($dist->{'dim'}[7]/2), $dist->{'dim'}[3], $col->{$colBarras->[$colum % @$colBarras]});
}
return $img->png;
}
=======================================================
--
Gunnar Wolf - gwolf@campus.iztacala.unam.mx - (+52-55)5623-1118
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF
Reply to: