[successivo] [precedente] [inizio] [fine] [indice generale] [indice analitico] [parte]
Jgraph(1) è un programma che serve a tracciare grafici e diagrammi strutturati. Diversamente da altri strumenti per il disegno, Jgraph è un programma non interattivo: legge un file di input (il sorgente) e produce un file di output (la presentazione) in formato PostScript oppure EPS. L'output può in seguito essere quindi visualizzato, stampato, incorporato in un altro file per ulteriori elaborazioni oppure convertito in altri formati.
Inoltre, si noti che Alml (il sistema di composizione SGML di Daniele Giacomini) offre supporto - a partire da gennaio 2006 - per il linguaggio Jgraph.
Questo capitolo costituisce una introduzione di livello elementare all'uso e alle caratteristiche principali del programma, senza alcuna prestesa di essere esauriente; la documentazione di riferimento più completa per Jgraph è costituita dalla pagina di manuale, cui si rinvia il lettore interessato per gli eventuali approfondimenti.
Ecco l'utilizzo tipico di Jgraph:
$
jgraph in.jgr > out.eps
[Invio]
oppure:
$
jgraph -P in.jgr > out.ps
[Invio]
o, ancora:
$
cat in.jgr | jgraph -P | ps2eps -f -l -q > out.eps
[Invio]
e simili.
In assenza di un nome di file dato come argomento, Jgraph legge dallo standard input.
Al fine di prendere confidenza con il programma Jgraph, cominciamo vedere alcuni semplici esempi. Per indicare a Jgraph di tracciare un nuovo grafico o diagramma si utilizza la parola chiave newgraph; quindi si aggiungono delle curve al diagramma mediante newcurve; infine si aggiungono dei punti alla curva mediante pts.
Il listato 6.1 mostra un esempio elementare, presentato graficamente in figura 6.2. Si tratta semplicemente di disegnare tre punti: (2,3), (4,5) e (1,6). Jgraph si occupa di aggiungere gli assi di riferimento e di scegliere lo stile di tracciamento dei punti; è un esempio decisamente banale, tanto per iniziare.
|
|
Si considerino adesso il listato 6.3 e la corrispondente figura 6.4. Si tratta di un esempio leggermente più complesso: nelle righe 1-3 si dà inizio al grafico mediante newgraph, quindi si definiscono le dimensioni degli assi;(2) le righe 5-9 tracciano tre curve: nella prima si lascia che sia Jgraph a scegliere lo stile di tracciamento, nella seconda si specifica di indicare i punti mediante triangoli connessi da una linea solida, nella terza si specifica di non indicare i punti ma di tracciare solamente la linea che li unisce (la linea sarà tratteggiata e di colore rosso(3)). Si noti che l'intervallo visibile degli assi è stato automaticamente calcolato in modo da contenere precisamente tutti i punti specificati nel sorgente.
Nella pagina di manuale si trovano definiti i possibili stili da associare allle parole chiave marktype e linetype. Si noti in particolare che newline è semplicemente un sinonimo per newcurve marktype none linetype solid.
|
|
L'algoritmo di riconoscimento dell'input da parte di Jgraph è basato non sulle righe bensì sugli elementi sintattici (token-based); Jgraph semplicemente lavora su parole separate da spazi bianchi; i commenti devono essere inclusi fra (* e *). Gli oggetti fondamentali per Jgraph sono:
la pagina;
i grafici;
gli assi;
le curve;
le stringhe;
le legende.
Si può pensare che, quando si opera sul sorgente, si stanno effettivamente creando o modificando tali oggetti nella presentazione. Pertanto, quando si scrive newcurve, si sta in effetti modificando o creando una curva, per la quale è possibile specificare attributi, come marktype e linetype, e dei punti. La maggior parte degli attributi possiedono un valore predefinito che però è possibile cambiare. Se si specifica un attributo più di una volta Jgraph considera valida l'ultima indicazione, sicché ad esempio newcurve marktype box marktype circle equivale a newcurve marktype circle.
In parziale deroga a quanto or ora specificato, la parola chiave pts agisce in maniera «additiva», pertanto newcurve pts 0 0 1 1 2 2 equivale a newcurve pts 0 0 pts 1 1 pts 2 2.
È inoltre possibile includere dei file esterni nel sorgente Jgraph mediante include nome_file.
Se capita di non gradire la maniera in cui Jgraph produce automaticamente gli assi, può tornare utile la tabella 6.5.
|
Il listato 6.6 e la figura 6.7 illustrano l'uso di alcuni degli attributi descritti nella tabella 6.5.
|
|
Jgraph assume dei valori predefiniti per le dimensioni degli indicatori di punto, ma è possibile impostarli diversamente mediante marksize larghezza altezza. La larghezza si intende nelle unità dell'asse delle ascisse, a meno che la scala non sia logaritmica nel qual caso si intende espressa in pollici; analogamente l'altezza fa riferimento all'unità dell'asse delle ordinate.
La parola chiave copycurve permette di creare una curva avente i medesimi attributi di quella precedente (ma non gli stessi punti, ovviamente).
Il listato 6.8 e la figura 6.9 illustrano un esempio. Si noti che cfill riempie l'interno degli indicatori con il colore specificato.
|
|
La gestione delle stringhe in Jgraph avviene mediante la parola chiave newstring. Gli attributi delle stringhe sono la posizione, la fonte, la dimensione della fonte, il colore, la rotazione, l'allineamento e il testo. La posizione si imposta mediante x posizione_x y posizione_y. La fonte dev'assere una fonte PostScript. Le fonti standard sono Times-Roman, Times-Italic, Times-Bold, Helvetica, Helvetica-Italic, Helvetica-Bold, Courier e Symbol. Il colore viene indicato tramite lcolor, oppure si utilizza lgray per indicare la scala di grigio. Gli allineamenti si specificano come segue:
hjl, hjr e hjc corrispondono a sinistra, destra e centro (orizzontale) rispettivamente;
vjt, vjb e vjc corrispondono a sopra, sotto e centro (verticale) rispettivamente.
Si può ruotare una stringa mediante rotate gradi. Si imposta il testo di una stringa mediante il carattere :, seguito da uno spazio bianco e quindi dal testo vero e proprio. Per ottenere del testo su più righe è possibile utlizzare il carattere \ al termine di ciascuna riga tranne l'ultima.
Anche le etichette dei grafici sono stringhe, quindi possono utilizzare gli attributi or ora descritti.
copystring copia tutti gli attributi di una stringa (testo incluso).
Il listato 6.10 e la figura 6.11 illustrano un esempio.
|
|
È possibile applicare un'etichetta a una curva mediante l'attributo label: esso indica a Jgraph di creare una voce in legenda per la curva data. Il listato 6.12 e la figura 6.13 forniscono un esempio.
|
|
Si possono cambiare la fonte e la posizione della legenda, come unità complessiva, scrivendo legend defaults e specificando gli attributi per le stringhe: in tal modo si modificano tutte le stringhe della legenda. Il listato 6.14 e la figura 6.15 forniscono un esempio; è istruttivo provare a modificarlo e vedere quali effetti ne sortiscano. Le legende hanno altre interessanti caratteristiche, che si trovano ben descritte nella pagina di manuale.
|
|
Analogamente al caso delle legende è possibile modificare l'insieme delle etichette di tacca di un asse, come unità complessiva, mediante l'attributo hash_labels: ad esempio, per cambiare le etichette di tacca in figura 6.9 in maniera tale che la fonte sia Times-Italic e la dimensione della fonte sia 16, si può scrivere hash_labels font Times-Italic fontsize 16, e analogamente per l'asse delle ordinate (listato 6.16, righe 4 e 7, e figura 6.17).
|
|
Utilizzando come indicatori xbar e ybar si ottengono i grafici a barre: xbar produce barre che si estendono parallelamente all'asse delle ordinate, ybar barre che si estendono parallelamente all'asse delle ascisse.
Il listato 6.18 e la figura 6.19 forniscono un interessante esempio di grafico a barre.
|
|
Alcune osservazioni in merito al listato 6.18:
Righe 3-6
Si imposta la dimensione e l'intervallo dei valori per l'asse delle ascisse e si impostano le tacche sulle unità senza tacche secondarie; inoltre si indica a Jgraph di non generare le etichette di tacca in modo automatico, poiché si desidera personalizzarle.
Righe 8-11
Niente di particolare da notare tranne l'attributo precision il quale specifica di includere tre decimali nelle etichette di tacca per l'asse delle ordinate.
Righe 13-17
Traccia la curva tramite barre rosse verticali.
Righe 19-24
Ulteriore modifica che interessa l'asse delle ascisse, generando etichette di tacca per ciascun punto e successivamente modificandole in maniera che appaiano ruotate di 90 gradi (in senso orario).
Righe 26-27
Si genera un etichetta per l'asse delle ordinate e un titolo per il grafico.
L'esempio illustrato nella presente sezione dovrebbe convincere delle possibilità del programma Jgraph: è possibile generare grafici anche di una certa complessità in maniera abbastanza naturale.
La possibilità di tracciare dei poligoni estende non poco le capacità grafiche del programma Jgraph: è sufficiente applicare l'attributo poly alla curva da tracciare. Gli attributi pfill e pcfill permettono inoltre di specificare una scala di grigio o un colore per la campitura del poligono. L'attributo linethickness consente di controllare lo spessore del perimetro.(4) È possibile campire il poligono con un disegno a strisce in alternativa alla campitura solida mediante ppattern stripe inclinazione, ove inclinazione controlla l'inclinazione delle strisce. Infine, se si indica -1 come colore di campitura del poligono viene tracciato solamente il bordo mentre l'interno rimane vuoto, il che può essere talvolta desiderabile.
Il listato 6.20 e la figura 6.20 presentano un esempio con alcuni poligoni di diversa campitura. Si osservi che Jgraph traccia le curve nell'ordine indicato, sicché è possibile prevedere le eventuali sovrapposizioni.
|
|
Si possono generare delle linee curve con Jgraph se si interpretano alcuni dei punti indicati come punti di controllo per una curva di Bézier.
Nella sezione 6.13 vengono indicati dei possibili spunti di approfondimento sulla questione, ma si consideri che per definire una curva di Bézier con Jgraph servono almeno quattro punti, e in generale è possibile tracciare una curva di Bézier mediante 3*n+1 punti di controllo, di cui 2*n di controllo e i rimanenti n+1 di passaggio della curva.(5)
Il listato 6.22 e la figura 6.23 fornuscono un esempio in cui viene disegnato un pallone da football americano (molto stilizzato a dire il vero) mediante curve di Bézier.
|
|
Accenniamo ad alcune ulteriori interessanti caratteristiche del programma Jgraph, rinviando il lettore interessato alla sezione 6.13 per eventuali approfondimenti.
Dall'interno di un sorgente Jgraph è possibile invocare un comando della shell o un programma esterno scrivendo shell : comando; l'output generato viene contestualmente incluso nel sorgente.
Un'altra caratteristica interessante di Jgraph è quella di poter utilizzare una qualunque immagine in formato EPS come indicatore, utilizzando l'attributo di curva eps.
Infine, si noti che è possibile tracciare più di un grafico nella stessa immagine mediante un ulteriore newgraph oppure mediante copygraph: in quest'ultimo caso il grafico successivo eredita gli assi dal precedente. Il posizionamento relativo dei vari grafici è gestibile mediante gli attributi di grafico x_translate e y_translate. È altresì possibile posizionare i vari grafici su più pagine, mediante la parola chiave newpage.(6) Il listato 6.24 e la figura 6.25 presentano un esempio di utilizzo di copygraph.
|
|
Il punto di forza dei programmi non interattivi è quello di poter essere facilmente utilizzati come anelli di una catena di strumenti o processi; la connessione delle varie parti può essere gestita semplicemente mediante generiche pipeline, o addirittura mediante specifici programmi «wrapper», progettati per uno scopo preciso, che costruiscano programmaticamente l'input da far elaborare.
Un esempio interessante è il programma njgraph.pl di Neil Spring. Si tratta di un piccolo sorgente in Perl che in pratica realizza una specie di programma frontale per Jgraph: esso legge dallo standard input una singola serie di dati da rappresentare graficamente, e dopo averli opportunamente passati a Jgraph per l'elaborazione invoca GV, a meno che lo standard output non venga rediretto. Il programma njgraph.pl riconosce altresì gli attributi marktype, linetype e color (e relativi valori) facoltativamente presenti sulla riga di comando, e li posiziona opportunamente all'interno del sorgente Jgraph prima dell'elaborazione.
La figura 6.26 illustra qualche esempio di invocazione del programma njgraph.pl, mentre la figura 6.27 ne illustra l'output.
|
|
Pochi giorni dopo la prima pubblicazione del presente articolo, ho ricevuto un messaggio di posta elettronica da parte di un lettore. Ecco il frammento rilevante:
|
Ad ulteriore conferma della versatilità degli strumenti come Jgraph, ho realizzato in poco più di mezz'ora(7) il programma data2multijgr.sh (il programma dovrebbe essere disponibile qui: <allegati/xs/data2multijgr_sh>). Il programma, pur essendo molto rudimentale, risolve il problema del lettore. Eccone la sintassi:
data2multijgr.sh [opzione] ... |
ed eccone un utilizzo tipico:
$
cat data
[Invio]
18 4 15 0 2 0 16 3 7 11 12 0 1 9 5 19 8 19 0 13 14 0 19 9 12 3 11 3 10 18 17 0 14 4 1 16 5 9 11 12 1 3 4 14 13 1 13 13 1 5 6 7 18 17 16 10 13 19 13 15 17 3 15 3 7 8 19 4 18 3 16 11 6 13 5 11 14 19 4 15 16 2 2 14 12 10 5 17 9 10 12 18 5 19 13 13 8 13 17 18 8 6 9 14 19 14 6 13 5 2 1 2 17 15 8 1 18 13 18 19 4 2 18 9 13 3 14 1 8 4 11 16 2 0 11 13 7 9 18 4 11 19 18 0 7 7 1 5 12 11 16 8 5 6 18 19 10 4 12 18 0 4 15 2 16 6 15 15 15 6 0 18 5 10 11 4 17 4 1 2 16 18 10 1 4 0 0 14 5 5 13 17 9 8 0 17 6 7 13 13 |
$
cat data | data2multijgr.sh -d 15 -t "Grafico multiplo" -X 40 -x -10 > multi.jgr
[Invio]
$
cat multi.jgr
[Invio]
newgraph title fontsize 50 : Grafico multiplo (1/14) xaxis min -10 max 40 size 5 hash_labels fontsize 30 yaxis min -1 max 15 size 8 hash_labels fontsize 30 newcurve marktype ybar cfill 1 0 0 marksize 1 0.75 pts 18 0 4 1 15 2 0 3 2 4 0 5 16 6 3 7 7 8 11 9 12 10 0 11 1 12 9 13 5 14 newpage newgraph title fontsize 50 : Grafico multiplo (2/14) xaxis min -10 max 40 size 5 hash_labels fontsize 30 yaxis min 14 max 30 size 8 hash_labels fontsize 30 newcurve marktype ybar cfill 1 0 0 marksize 1 0.75 pts 19 15 8 16 19 17 0 18 13 19 14 20 0 21 19 22 9 23 12 24 3 25 11 26 3 27 10 28 18 29 newpage newgraph title fontsize 50 : Grafico multiplo (3/14) xaxis min -10 max 40 size 5 hash_labels fontsize 30 yaxis min 29 max 45 size 8 hash_labels fontsize 30 newcurve marktype ybar cfill 1 0 0 marksize 1 0.75 pts 17 30 0 31 14 32 4 33 1 34 16 35 5 36 9 37 11 38 12 39 1 40 3 41 4 42 14 43 13 44 newpage newgraph ... |
$
cat multi.jgr | jgraph -P > multi.ps
[Invio]
$
Il file multi.ps
che così si ottiene è un file PostScript composto da più pagine ciascuna contenente un grafico relativo a un segmento specifico dei dati (la figura 6.31 riporta per brevità solamente le prime tre pagine).
|
La tabella 6.32 riassume le opzioni del programma. Chiunque fosse interessato è invitato adattare il programma data2multijgr.sh alle proprie esigenze, o aggiugervi delle caratteristiche più sofisticate (magari inviando una copia del programma modificato al sottoscritto).
James S. Plank, Jgraph -- A Filter for Plotting Graphs in Postscript
Department of Computer Science, School of Engineering, University of Virginia
Justin Zobel, Example jgraph scripts
Ajay Shah, A collection of examples using Jgraph
Wikipedia: Bézier curve
Neil Spring, Neil's Software
Informatica per sopravvivere 2006.02.19 --- Copyright © 2004-2006 Massimo Piai -- <pxam67 (ad) virgilio·it>
2) in pollici
3) I colori vanno specificati in forma codificata mediante terne RGB, con valore uno che indica la massima saturazione.
4) in unità assolute PostScript, valore predefinito 1,0
5) con n intero positivo
6) Ovviamente si tratta di una possibilità compatibile solo con l'output in formato PostScript (non EPS).
7) A dire il vero il programma è stato successivamente limato, ma il prototipo funzionante era pronto dopo il tempo indicato (NdA).
Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome grafici_e_diagrammi_con_jgraph.html
[successivo] [precedente] [inizio] [fine] [indice generale] [indice analitico]