Category Archives: gnuplot

Invece del link

Continuo dal post precedente Usare un link simbolico  vista l’impraticabilità della soluzione “symbolic link” con Windows.
Come mi è stato fatto notare quelli su Windows non sono link ma collegamenti (ahemmm…). Anzi in inglese si chiamano shortcut, nessuna possibilità di confusione. Per sapere tutto su questa bestia c’è, al solito, Wikipedia.
OK, l’alternativa. Ma a questo punto devo dare prima una spiegazione: a cosa serve, cosa devo fare?
Ecco, si tratta di Gnuplot. Qui un esempio semplicissimo, per comodità ricopio lo script:

set term dxf
set output 'dxf.dxf'
TITLE = "DXF"
set title TITLE offset char 0, char -1
set xrange [0:7]
set yrange [0.7:10.3]
unset key #toglie la legenda

plot "dati-dxf" with linespoints # lw 3

Quello che rende bello questo script è che i dati da diagrammare (plottare) sono su un file separato, non c’è bisogno di cambiare lo script per altri dati. Almeno con Linux se le linee 2 e 9 contengono nomi di link simbolici invece di nomi di file. Adesso immaginatevi un lavoro vero: ci saranno da produrre diversi diagrammi, tutti simili, una pizza, se si deve fare con Windows.

Ancora un’osservazione: sì ho scorso il manuale (non tutto ma le parti che mi sembravano sull’argomento) e pare che non sia un’opzione prevista. Il manuale l’ho trovato anche molto soporifero e un po’ confuso.

La soluzione per Windows è di fare una copia dello script sostituendo la stringa segnaposto per i nomi dei file con quella passata come parametro. Non sarà ottimale ma funziona.

Allora, questo è lo script, modificato, da usare come template.

set term dxf
set output 'NOMEFILE.dxf'
TITLE = "DXF"
set title TITLE offset char 0, char -1
set xrange [0:7]
set yrange [0.7:10.3]
unset key #toglie la legenda

plot "NOMEFILE" with linespoints # lw 3

E questo lo script Python

#!/usr/bin/python
# -*- coding: utf-8 -*-

import os, sys

if len(sys.argv) <= 2:
	print 'uso:', sys.argv[0], '<nome script> <nome dati>'
	sys.exit(1)

nomescript = sys.argv[1]
nomedati = sys.argv[2]

if not os.path.exists(nomescript):
	print nomescript, 'non esiste'
	sys.exit(2)

nomecopia = '{}_{}'.format(nomedati, os.path.basename(nomescript))
print 'creo', nomecopia,

f = open(nomescript, 'r')
scr = f.read()
f.close()

cerco = 'NOMEFILE'
off = len(cerco)
p = scr.find(cerco)
while p >= 0:
	print p,
	scr = '{}{}{}'.format(scr[0:p], nomedati, scr[p+off:])
	p = scr.find(cerco, p + off + 1)

g = open(nomecopia, 'w')
g.write(scr)
g.close()
print

tpl

Ecco il risultato:

meld

OK.

Conclusioni:

  • sembra che funzioni;
  • mi rileggo il manuale non vorrei mai che…;
  • queste cose si fanno su Ubuntu (TehBoss).

Basta, torno a Go.

Asymptote, bello ma no

Nei giorni scorsi ho installato Asymptote, la versione presente nel Software Center di Ubuntu, leggermente più vecchia della corrente.
Me l’aveva consigliato l’amico Massimo, qui.

Massimo ha ragione, bello, fa anche più cose di Gnuplot. Ma ci sono un paio di problemi, se ho visto bene. Intanto è più complesso, più difficile da usare, almeno per le nostre necessità. Con Gnuplot ormai abbiamo preparato gli script (mezza dozzina circa) che coprono tutti i nostri casi. Eventualmente basta cambiare le opzioni di output, il terminale e, volendo essere raffinati, il nome dei file dei dati.

Insomma le nostre esigenze sono diverse da quelle accademiche. E, soprattutto, rifuggiamo TeX (cioè LaTeX), molto meglio M$ Word 😉

Quindi resto fermo a quanto detto qui, qui e qui.
Anche perché ho riscoperto quanto la messa a punto di un programma ‘vero’ sia cosa lunga e ingarbugliata, con ripensamenti, bug (un paio) che saltano fuori tardi e come sia difficile fare le cose per telefono o in rete. C’è poi un’altra cosa che avevo quasi rimosso: il ‘puter fa i calcoli ma manca di buon senso, devi mettercelo tu. E poi ci sarebbero aneddoti da raccontare ma sanno dove abito quindi non dico niente, per esempio, delle condizioni ai bordi (non so se il termine è comprensibile, le abbiamo chiamate così).

Inoltre c’è chi preferirebbe lavorare con Windows (praticamente tutti). Io no.

Ah, sì! ho trovato due cose bellissimissime per i prossimi post, qualcosa di completamente differente, per dirla à la Monty Python.

Ancora Gnuplot

OK, ancora Gnuplot, continuo da qui: Gnuplot – primi passi. In realtà per quel che serve alle mie necessità non c’è molto altro da dire. È vero che ci sarebbero tante altre possibilità, come inserire scritte nel grafico ma non sottovalutare Gimp (o Photoshop).
Inoltre disegni complessi conviene gestirli diversamente. È il caso delle mappe che risultano strettamente legate all’elaborazione e spesso sono richieste l’utilizzo di basi e scale ben precise.

Però ci sono ancora alcuni grafici da esaminare. Per esempio i boxes. Ecco un esempio, complesso, copiato dal sito Gnuplotting

# AUTHOR: Hagen Wierstorf -- modificato

set terminal x11 size 350, 262
# color definitions
set border linewidth 1.5
set style line 1 lc rgb 'gray30' lt 1 lw 2
set style line 2 lc rgb 'gray40' lt 1 lw 2
set style line 3 lc rgb 'gray70' lt 1 lw 2
set style line 4 lc rgb 'gray90' lt 1 lw 2
set style line 5 lc rgb 'black' lt 1 lw 1.5

set style fill solid 1.0 border rgb 'grey30'

set key right top
set border 3

set tics scale 0.75
set xtics nomirror out ('Condition 1' 0,'Condition 2' 1)
set ytics nomirror out 0.5

set yrange [0:1.3]
set xrange [-0.6:2]

# Draw line for significant test
set arrow 1 from 0,1 to 1,1 nohead ls 5
set arrow 2 from 0,1 to 0,0.95 nohead ls 5
set arrow 3 from 1,1 to 1,0.95 nohead ls 5
set label '**' at 0.5,1.05 center

# Size of one box
bs = 0.2

# Plot mean with variance (std^2) as boxes with yerrorbar
plot 'dbox' i 0 u ($0-bs):1:($2**2) notitle w yerrorb ls 1, \
     ''     i 0 u ($0-bs):1:(bs) t 'A' w boxes ls 2, \
     ''     i 1 u 0:1:($2**2) notitle w yerrorb ls 1, \
     ''     i 1 u 0:1:(bs) t 'B' w boxes ls 3, \
     ''     i 2 u ($0+bs):1:($2**2) notitle w yerrorb ls 1, \
     ''     i 2 u ($0+bs):1:(bs) t 'C' w boxes ls 4
# Condition 1
# Condition 2
#
# mean      std
# A
0.77671    0.20751
0.33354    0.30969

# B
0.64258    0.22984
0.19621    0.22597

# C
0.49500    0.31147
0.14567    0.21857

Un’altra possibilità e quella di produrre un file DXF, per AutoCAD. Ecco un esempio minimo. L’ho visualizzato con LibreCAD, ovviamente.

set term dxf
set output 'dxf.dxf'
TITLE = "DXF"
set title TITLE offset char 0, char -1
set xrange [0:7]
set yrange [0.7:10.3]
unset key #toglie la legenda

plot "dati-dxf" with linespoints # lw 3
1 1 .1
2 2 .2
3 6 .7
4 4 .2
5 2 .5
6 7 .6

Anche in questo caso i miei contatti su questo la sanno molto più lunga.

Una cosa che pensavo utile sono le scale logaritmiche. Supponiamo di avere questa serie di dati

0    1
0.5  2
1    3
1.5  4
2    7
2.5 12
3   20
3.5 33
4   55

il grafico “normale” risulta questo

set term x11 size 400,300
TITLE = "esponenziale"
set title TITLE offset char 0, char -1
set xrange [0:4.5]
set yrange [0:60]
unset key #toglie la legenda

plot "dexp" with lines lw 3

Se l’asse y è logaritmico si ha invece

set term x11 size 400,300
TITLE = "esponenziale"
set title TITLE offset char 0, char -1
set logscale y
set xrange [0:4.5]
set yrange [0.1:60]
unset key #toglie la legenda

plot "dexp" with lines lw 3

Fin qui non ci sono difficoltà di rappresentazione ma per x = 5 si ha y = 148. Però mi dicono che i logaritmi sono delle brutte bestie che nessuno capisce. Anche se le scale per il livello sonoro e l’intensità dei terremoti, ampiamente note e usate, sono logaritmiche (ma nessuno lo sa, c’è una congiura contro noi tutti!).

Molto apprezzata è stata la prassi di avere i dati separati dallo script. Questo rende più agile la modifica al volo di quest’ultimo. Cosa però non nuova, almeno per me è vecchia di 30 anni.

OK! ci sarebbero ancora parecchie cose da esaminare e raccontare. Questo è quello che mi serviva per le elaborazioni in Fortran (principalmente, c’è anche Java) di cui ho parlato negli ultimi mesi.

Per approfondimenti vi rimando al sito Gnuplotting: c’è tutto, anzi di più 😀

Personalmente voglio dare una sbirciatina a Asymptote, quello consigliato e usato da Massimo 😀

Gnuplot – primi passi

OK, continua da qui e ci sto prendendo la mano, pian-pianino. Intanto è fondamentale il sito Gnuplotting, segnalato dal dr.prof. Poi quando avrò finito esplorerò anche Asymptote, quello usato da Massimo Ortolano, adesso ric.conf. ma poi diventerà anche lui dr.prof. 😀

Intanto ho installato l’ultima versione, la 4.6.0 che ha qualcosa in più. Anche qualche bug: non accetta i terminali gif, jpeg e png, colpa di libgd. Ma si può rimediare facilmente.
Poi una cosa cui non avevo fatto attenzione: i grafici devono essere di due tipi: bianco/nero e colore. Io che sono vecchio credevo che le relazioni dovessero essere fotocopiabili (anzi faxabili, dice il boss) e quindi necessariamente b/n. Questa credenza è vera e falsa allo stesso tempo, anzi detto in termini tecnici: dipende. Cambia di volta in volta in funzione dell’oggetto, umore del relatore, inchiostro della stampante, fase lunare e altro ancora.
Ma c’è un elaborato che è ormai imprescindibile e sempre sgargiatamente colorato e, spesso, animato: la presentazione PP (solo io dico PowerPoint).
Poi la stessa presentazione PP viene stampata come PDF e diventa “le slide“, cosa buona e giusta ma manca (di solito) tutto il ragionamento che c’è nella relazione. OK, sto divagando, non è quello di cui devo occuparmi e parlare.

Allora oggi si parla di linee, digrammi semplici e basta.

Cominciamo con linee semplici, ecco

set term x11 size 400, 300
<pre>TITLE = "Linetypes"
set title TITLE offset char 0, char -1
set xrange [0:2]
set yrange [0.7:10.3]
unset key

plot 1 linetype 1, \
     2 linetype 2, \
     3 linetype 3, \
     4 linetype 4, \
     5 linetype 5, \
     6 linetype 6, \
     7 linetype 7, \
     8 linetype 8, \
     9 linetype 9, \
    10 linetype 10

Con “q” chiudiamo la sessione.

Ecco la versione modificata per ottenere il file postscript

set term postscript size 4, 3 # attenzione numeri piccoli!!!
set output "lt.ps"
TITLE = "Linetypes"
set title TITLE offset char 0, char -1
set xrange [0:2]
set yrange [0.7:10.3]
unset key

plot 1 linetype 1, \
     2 linetype 2, \
     3 linetype 3, \
     4 linetype 4, \
     5 linetype 5, \
     6 linetype 6, \
     7 linetype 7, \
     8 linetype 8, \
     9 linetype 9, \
    10 linetype 10

con il comando gnuplot linetypes-ps otteniamo il file lt.ps che può essere visualizzato con evince (o altri programmi) o convertito negli usuali formati grafici. Si può usare convert lt.ps lt.png (bisogna aver installato imagemagick) o aprirlo con gimp.

Passo adesso allo spessore delle linee, ecco

set term x11 size 400, 300
TITLE = "Linewidths"
set title TITLE offset char 0, char -1
set xrange [0:2]
set yrange [0.7:10.3]
unset key #toglie la legenda

plot 1 linetype 1 linewidth 1, \
     2 linetype 1 linewidth 2, \
     3 linetype 1 linewidth 3, \
     4 linetype 1 linewidth 4, \
     5 linetype 1 linewidth 5, \
     6 linetype 1 linewidth 6, \
     7 linetype 1 linewidth 7, \
     8 linetype 1 linewidth 8, \
     9 linetype 1 linewidth 9, \
    10 linetype 1 linewidth 10

Come prima si può ottenere la versione b/n, cambiando il terminale

Una versione particolare: punti ravvicinati

set term x11 size 400, 300
TITLE = "Linespoints"
set title TITLE offset char 0, char -1
set xrange [0:2]
set yrange [0.7:10.3]
unset key #toglie la legenda

plot 1 with linespoints ls 1, \
     2 with linespoints ls 2, \
     3 with linespoints ls 3, \
     4 with linespoints ls 4, \
     5 with linespoints ls 5, \
     6 with linespoints ls 6, \
     7 with linespoints ls 7, \
     8 with linespoints ls 8, \
     9 with linespoints ls 9, \
    10 with linespoints ls 10

e la corrispondente b/n via ps

una skifetsa, certo.

In realtà i points possono servire per un caso come questo

set term x11 size 400, 300
TITLE = "Circles"
set title TITLE offset char 0, char -1
set xrange [0:7]
set yrange [0.7:10.3]
unset key #toglie la legenda

plot "dati-circles" with circles, \
     "dati-circles" with lines lw 3, \
     "dati-circles" with points lw 5

abbiamo bisogno di un file di dati: dati-circles

1 1 .1
2 2 .2
3 6 .7
4 4 .2
5 2 .5
6 7 .6

e anche

OK, basta per adesso,  poi, prossimamente, forse… 😉

Gnuplot – intro


Gnuplot pare sia proprio quello che serve per visualizzare uno o più grafici riassuntivi per le elaborazioni fatte con programmi seriosi come quelli in Fortran di cui ho trattato ultimamente.

Gnuplot is a portable command-line driven graphing utility for Linux, OS/2, MS Windows, OSX, VMS, and many other platforms.

Uh! c’è ancora VMS! roba dell’altro millennio, come pure OS/2. Va beh, c’è per Linux e Windows. Ho installato la versione disponibile nel Softare Center di Ubuntu, la 4.4.3 vecchia di più di un anno, oggi c’è la 4.6. Prossimamente, forse…

Intano oggi voglio solo far vedere alcuni esempi, tanto per farci conoscenza. Poi c’è un corposo manuale 235 pagine in PDF, relativo alla versione 4.5 (grrr!!!).

Subito una cosa relativa al manuale: fatto bene con tantissimi link e esempi. Devo ancora leggerlo, l’ho solo scorso, l’unica pecca, secondo me, è che sul kindle è al limite della leggibilità. Peccato. Ma tanto conto di provare tutti gli esempi che mi interessano, nei prossimi post, avvertiti 😉

L’aspetto accattivante è che gli script risultano brevi, semplici (almeno così sembra di primo acchito) ma potenti. E si può fare quasi tutto quello che serve. Per adesso non ho visto se è possibile avere le scale logaritmiche, a volte sono comode.
I grafici possono essere visualizzati a monitor o salvati negli usuali formati, insomma sembra proprio Ok, vale la pena di affrontare il mallopposo manuale.

Inoltre sul Web si trovano parecchi esempi, quelli che seguono li ho raccattati, non ricordo bene dove.

f(x) = exp(-x**2 / 2)
plot [t=-4:4] f(t) title "Bell Curve", t**2 / 16 title "Parabola"

pi=3.1415926
f(x,n)=(n>=0) ? sin((2*n+1)*x)/(2*n+1)+f(x,n-1) : 0
plot[-pi:pi] for [n=0:6] f(x,n)

set contour
set view 60,45
set isosample 20,20
f(x,y,t)=exp(-x*x-y*y)
splot[-5:5][-5:5] f(x,y,1)

# set terminal pngcairo  transparent enhanced font "arial,10" fontscale 1.0 size 500, 350
# set output 'simple.1.png'
set key inside left top vertical Right noreverse enhanced autotitles box linetype -1 linewidth 1.000
set samples 50, 50
plot [-10:10] sin(x),atan(x),cos(atan(x))

I grafici precedenti sono quelli visualizzati nel terminale di default. Naturalmente è possibile cambiarlo, come così:

set terminal png
set output 't.png'
set contour
set view 60,45
set isosample 20,20
f(x,y,t)=exp(-x*x-y*y)
splot[-5:5][-5:5] f(x,y,1)

OK, mi metto a studiare il manuale. Non ci sono per nessuno 😀 😉