Quante volte siamo costretti a creare grafici per compiacere le manie statistiche del nostro boss, e quante volte, per questo motivo, siamo costretti a trasportare dati da un file a un software tipo Microsoft Excel o GnuPlot. Sarebbe molto meglio se il tutto fosse automatizzato da uno script, magari lo stesso che utilizziamo per prelevare i dati.
Se lo script è stato scritto in Perl, abbiamo uno strumento per fare tutto in un sol colpo, ovvero
Chart, uno dei tanti moduli di
CPAN: scarichiamo l'occorrente con
cpan Chart::Base e aiutiamoci con un
articolo di
Peyton McCullough per capire i fondamenti di questo strumento.
Per utilizzare questa collezione di moduli è necessario per prima cosa instanziare l'oggetto e indicare, in pixel, le dimensioni finali del nostro grafico.
se Chart::Lines;
my $chart = new Chart::Lines(600, 400);
my @data = ( [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug','Sep', 'Oct', 'Nov',,Dec' ], [ 46, 50, 56, 61, 67, 73, 79, 79, 74, 63, 51, 46 ],);
$chart->png('temps.png', @data);
La funzione png(), come si evince, è quella che permette di disegnare i dati memorizzati nell'array @data, in cui le stringhe costituiscono i valori delle ascisse, mentre il primo parametro passato a
png(), (
temps.png), è il nome dell'immagine creata. Lo stesso risultato è ottenibilie usando lo stralcio seguente:
$chart->add_dataset('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul','Aug', 'Sep', 'Oct', 'Nov', 'Dec');$chart->add_dataset(46, 50, 56, 61, 67, 73, 79, 79, 74, 63, 51, 46);
$chart->add_dataset(37, 39, 41, 44, 49, 53, 57, 58, 55, 48, 42, 37);
$chart->png('temps.png');
In questo caso abbiamo creato un grafico con due linee statistiche e senza creare un array. Nonostante tutto, il risultato è ancora un po' scarno, ma noi possiamo rendere migliore l'immagine finale aggiungendo il titolo e le etichette agli assi in uno dei due modi seguenti:
$chart->set('title' => 'Average Monthly Temperatures for Portland,OR', 'x_label' => 'Month', 'y_label' => 'Temperature (*F)', );
my %property;
$property{'title' } = 'Average Monthly Temperatures for Portland, OR';$property{'x_label'} = 'Month';$property{'y_label'} = 'Temperature (*F)';$chart->set(%property);
Il secondo metodo, tramite il vettore %property, è più comodo, poiché ci permette anche di definire i valori di massimi e minimi delle ordinate, l'intervallo di valori da visualizzare, la legenda e i colori per i grafici come vediamo nell'esempio qui riportato:
$property{'min_val'} = 0;$property{'include_zero'} = 'true';$property{'max_val'} = 90;$property{'integer_ticks_only'} = 'true';$property{'skip_int_ticks'} = 5$property{'legend_labels'} = [ 'High', 'Low' ];$property{'colors'} = {'dataset0' => [255, 0, 0], 'dataset1' => [0, 0,255]};
Tutto qui? Ovviamente no, questo è solo un modo per disegnare i grafici; esso tuttavia mostra le funzioni generiche per la visuallizzazione e il rendering. Se servisse un grafico a barre, basterebbe modificare solo l'inizializzazione del grafico, senza altre modifiche di sorta.
use Chart::Bars;
my $chart = new Chart::Bars(600, 400);