[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: