Gnuplot es un software de código disponible y libre de amplio uso en la comunidad científica, que genera gráficos en formatos a elección como Portable Network Graphics (png), Gráficos vectoriales escalables (svg), Graphics Interchange Format (gif), PostScript (ps) y otros a partir de series de datos o funciones matemáticas. Gnuplot determina los rangos de las variables y la escala adecuada para para representarlos, la subdivisión de los ejes de abscisa y ordenada. (La abscisa es la coordenada horizontal y se representa habitualmente por la letra x, mientras que la ordenada es la coordenada vertical y se representa por la y.)
Ver instrucciones en la página central de Gnuplot: http://www.gnuplot.info/
Gnuplot puede operar.
Aquí solo trataremos esta última, la opción script. Los datos a graficar pueden ser incluidos en el mismo script. Pero, para separar los problemas, usaremos un archivo separado.[notas 1]
El ambiente utilizado para los ejemplos es el sistema operativo Linux, con la distribución Ubunto 18.04 , con Gnuplot 5.2. instalado.
A partir de algún momento es indispensable recurrir a la documentación oficial de gnuplot, disponible en http://www.gnuplot.info/ .
Gnuplot puede representar, en un plano de dos dimensiones, series de datos numéricos y también curvas definidas por funciones matemáticas.
Puede proyectar superficies en el espacio de tres dimensiones sobre un plano de dos dimensiones, caso que veremos posteriormente.
Para el ingreso de los datos a graficar existen varias posibilidades:
Por razones didácticas utilizaremos aquí un archivo de texto, separado del script, con dos o más columnas. Cada columna puede ser aplicada al eje de las abscisas o al de las ordenadas. Con algunas restricciones gnuplot también puede representar series que contengan strings (texto). Pero entonces, la otra columna debe ser numérica.[notas 2]
Para separar las columnas se utiliza un espacio (" "), para señalar las décimas de un número se usa el punto (".") y no la coma (","). La Codificación de caracteres (encoding) es utf-8. Para indicar que se desconoce el valor de un punto de la serie (columna) se utiliza NaN (Not a Number).
Para un valor que contenga dos o más palabras, se debe encerrar el valor con comillas: "Río San Pedro de Inacaliri".[notas 3]
Un comentario comienza con un rombo ("#").
Estas normas son convenciones y pueden ser modificadas de acuerdo a lo indicado en la documentación.
La imagen del lado derecho es una copia traducida de la publicada en gnuplot demo script: enhanced_utf8.dem con posibles usos de tipos de letras, posiciones, etc. El código puede ser visto en la respectiva página de commons que almacena la imagen.
Gnuplot admite cualquier abreviatura de comandos que no sea ambigua. Las abreviaturas más conocidas son:
A veces al escribir un comando demasiado largo se le "corta" en trozos y se le agrega una barra diagonal invertida ("backslash" en inglés) "\" al final de la línea. Es importante que no existan más caracteres después del backslash. Asi entonces el comando:
plot "datos" using 1:2, "" using 1:3, "" using 1.4
puede quedar como:
plot "datos" using 1:2, \
"" using 1:3, \
"" using 1.4
Esto puede facilitar la lectura o la comprensión del script.
Cada tipo de archivo (gif, svg, png, ps, etc) tiene particularidades diferentes. Algunos permiten más o menos colores, tienen más o menos tipos de letras, etc. Una visión sinóptica de las posibilidades se obtiene mediante el comando "test" que genera una imagen con algunas figuras y textos que las muestran.
Script:
set terminal png
set output "ayuda1.png"
test
Datos:
Gnuplot utiliza, en cuanto sea posible, valores default bastante adecuados para dar valores a variables que no han sido definidas por el usuario, en este caso el ancho y alto de la imagen.
Script ayuda2.gp:
set terminal png
set output 'Gnuplot-Ayuda2.png'
plot 'ayuda2.dat' using 2:3
Datos en 'ayuda2.dat':
ene 1 89.375 69.661 50.817 25.980 8.331 2.023
feb 2 71.917 46.100 26.824 9.358 2.319 0.858
mar 3 30.633 24.430 18.067 9.117 3.011 1.304
abr 4 43.130 33.092 23.859 12.392 4.937 2.486
may 5 158.088 110.296 71.317 30.994 11.104 6.076
jun 6 271.357 199.339 137.198 67.184 27.882 16.634
jul 7 322.921 241.560 169.950 86.790 37.931 23.326
ago 8 163.320 137.924 111.449 71.462 35.940 19.822
sep 9 133.848 109.816 85.511 50.546 22.234 10.818
oct 10 103.302 77.693 54.348 25.744 7.525 1.647
nov 11 99.588 82.178 64.029 36.617 12.266 1.217
dic 12 91.782 76.519 60.607 36.573 15.224 5.537
Ejecución del script:
Yo@miPC:mi/dir/graficos>gnuplot -c ayuda2.gp
El script de 3 líneas elabora un diagrama "png" de 640 × 480 pixels y 4 KB de peso con:
Nuestro primer intento ha resultado bien, pero debemos entregar al lector del diagrama toda la información necesaria para una comprensión cabal del gráfico.
En este caso, las columnas del archivo de datos son promedios estadísticos calculadas a partir de mediciones hechas durante muchos años al caudal del Río Tinguiririca y sirven para generar las curvas de variación estacional que a su vez se utilizan para obtener una estimación racional de la probabilidad de que el caudal del río alcance o exceda una cota determinada. Para dar esa información se debe dar el origen de los datos mediante comentarios, lo que haremos con las dos primeras líneas del archivo de datos:
# url: https://mma.gob.cl/wp-content/uploads/2017/12/Rapel.pdf
<-- esto es un comentario# Tabla 4.7: Tinguiririca en Los Olmos pág. 67
<-- esto es un comentarioAgregamos también una tercera línea, que no es comentario, y que entrega los nombres apropiados de las columnas. Señala el mes en que se estima el caudal y la probabilidad en tanto por ciento (%) de que el caudal alcance o exceda la cota que aparece en la columna y mes respectivo.
mes ord 5% 10% 20% 50% 85% 95%:
<-- esto NO es un comentarioEs importante repetir que esa línea no es un comentario, no tiene un rombo "#" al comienzo. El script lleva el comando set key autotitle columnhead por lo que la línea sera leída con los datos, pero interpretada como los nombres de las columnas y no como coordenadas de puntos a graficar.
Script ayuda3.gp:
set terminal png truecolor size 280, 320 font "Helvetica, 10" background rgb "white"
set margins 9,3,3,4 # <left>, <right>, <bottom>, <top>
set output 'gnuplot-ayuda3.png'
set grid
set yrange [0:]
set xlabel "mes"
set ylabel "Caudal (m³/s)"
set title "Curvas de variación estacional de\ncaudales promedio mensual en m³/s\n{/:Bold Río Tinguiririca} en Los Olmos" offset 0,-0.5
set style data line
set key autotitle columnhead textcolor variable samplen 1 spacing 1 left top maxrows 3
plot 'ayuda3.dat' using 2:3 with lines
Datos en ayuda3.dat:
# url: https://mma.gob.cl/wp-content/uploads/2017/12/Rapel.pdf
# Tabla 4.7: Tinguiririca en Los Olmos pág. 67
mes ord 5% 10% 20% 50% 85% 95%
ene 1 89.375 69.661 50.817 25.980 8.331 2.023
feb 2 71.917 46.100 26.824 9.358 2.319 0.858
mar 3 30.633 24.430 18.067 9.117 3.011 1.304
abr 4 43.130 33.092 23.859 12.392 4.937 2.486
may 5 158.088 110.296 71.317 30.994 11.104 6.076
jun 6 271.357 199.339 137.198 67.184 27.882 16.634
jul 7 322.921 241.560 169.950 86.790 37.931 23.326
ago 8 163.320 137.924 111.449 71.462 35.940 19.822
sep 9 133.848 109.816 85.511 50.546 22.234 10.818
oct 10 103.302 77.693 54.348 25.744 7.525 1.647
nov 11 99.588 82.178 64.029 36.617 12.266 1.217
dic 12 91.782 76.519 60.607 36.573 15.224 5.537
Ejecución del script:
Yo@miPC:mi/dir/graficos>gnuplot -c ayuda3.gp
Con ayuda3.gp hemos graficado el caudal del río que ocurre con una probabilidad del 5%, es decir, una vez cada 20 años. Para eso hemos utilizado varias nuevas órdenes o nuevos parámetros que pasamos a explicar.
Para agregar más curvas al mismo diagrama solo es necesario extender la orden
plot 'ayuda3.dat' using 2:3
a la orden:
plot 'ayuda3.dat' using 2:3, 'ayuda3.dat' using 2:4, 'ayuda3.dat' using 2:5, 'ayuda3.dat' using 2:6, 'ayuda3.dat' using 2:7, 'ayuda3.dat' using 2:8
que puede ser abreviada a:
plot 'ayuda3.dat' using 2:3, '' using 2:4, '' using 2:5, '' using 2:6, '' using 2:7, '' using 2:8
El significado de '' using 2:4
es "utilizar el mismo archivo de datos anterior para graficar las columnas 2:4".
Más adelante veremos que existe una manera más corta aún:
plot for [n=3:8] 'ayuda3.dat' using 2:(column(n))
Mediante un Bucle (programación) se repite la representación de los datos de una columna mediante una curva para 6 columnas, desde la 3. a la 8. .
Script ayuda4.gp:
set terminal png truecolor size 280, 320 font "Helvetica, 10" background rgb "white"
set margins 9,3,3,4 # <left>, <right>, <bottom>, <top>
set output 'gnuplot-ayuda4.png'
set grid
set yrange [0:]
set xlabel "mes"
set ylabel "Caudal (m³/s)"
set title "Curvas de variación estacional de\ncaudales promedio mensual en m³/s\n{/:Bold Río Tinguiririca} en Los Olmos" offset 0,-0.5
set style data line
set key autotitle columnhead textcolor variable samplen 1 spacing 1 left top maxrows 3
plot 'ayuda3.dat' using 2:3, 'ayuda3.dat' using 2:4, 'ayuda3.dat' using 2:5, 'ayuda3.dat' using 2:6, 'ayuda3.dat' using 2:7, 'ayuda3.dat' using 2:8
Datos en ayuda3.dat son los mismos del ejemplo anterior:
# url: https://mma.gob.cl/wp-content/uploads/2017/12/Rapel.pdf
# Tabla 4.7: Tinguiririca en Los Olmos pág. 67
mes ord 5% 10% 20% 50% 85% 95%
ene 1 89.375 69.661 50.817 25.980 8.331 2.023
feb 2 71.917 46.100 26.824 9.358 2.319 0.858
mar 3 30.633 24.430 18.067 9.117 3.011 1.304
abr 4 43.130 33.092 23.859 12.392 4.937 2.486
may 5 158.088 110.296 71.317 30.994 11.104 6.076
jun 6 271.357 199.339 137.198 67.184 27.882 16.634
jul 7 322.921 241.560 169.950 86.790 37.931 23.326
ago 8 163.320 137.924 111.449 71.462 35.940 19.822
sep 9 133.848 109.816 85.511 50.546 22.234 10.818
oct 10 103.302 77.693 54.348 25.744 7.525 1.647
nov 11 99.588 82.178 64.029 36.617 12.266 1.217
dic 12 91.782 76.519 60.607 36.573 15.224 5.537
Ejecución del script:
Yo@miPC:mi/dir/graficos>gnuplot -c ayuda4.gp
Este ejemplo muestra mejor el significado del comando set key
Aquí hacemos uso de la facilidad con que gnuplot puede graficar funciones matemáticas, en este caso del Seno (trigonometría). Pero nuestro fin es explicar como determinar las dimensiones y origen de coordenadas que utiliza Gnuplot.
Diagrama es aquí el rectángulo encerrado por los ejes x e y de la serie de datos que graficamos.
Canvas o pantalla, es aquí la imagen rectangular completa que produce Gnuplot, en nuestro caso en formato png.
Normalmente gnuplot puede establecer muy adecuadamente las dimensiones de la imagen y no se necesita intervención del usuario. Pero al momento de querer ubicar dentro del diagrama letras, flechas u otros objetos, es importante conocer las coordenadas que gnuplot utiliza en cada caso.
Gnuplot posee 5 diferentes sistemas de coordenadas, todos ellos con un eje horizontal "x" creciente hacia la derecha y un eje vertical "y" creciente hacia arriba. Se diferencian en la ubicación de su origen, en las unidades que utilizan y en el rango que cubren sus variables.
propiedad / nombre | first | second | graph | screen | character |
---|---|---|---|---|---|
origen de coordenadas | Esquina inferior izquierda del diagrama | Esquina inferior izquierda del diagrama | Esquina inferior izquierda del diagrama | Esquina inferior izquierda de canvas | Esquina inferior izquierda del canvas |
rango | xrange, yrange | x2range, y2range | 0.0-1.0, 0.0-1.0 | 0.0-1.0, 0.0-1.0 | (depende del tipo de letras) |
unidades | 1 | 1 | 1 | 1 | Ancho y alto del tipo de letra usado |
posición de ejes visibles | x: hor. abajo y:vert. izquierda |
x:hor. arriba y:vert. der. |
(invisibles) | (invisibles) | (invisibles) |
Script ayuda6.gp:
set terminal png size 500, 500 font "Helvetica, 10"
set output 'Gnuplot-ayuda10.png'
#set loadpath 'gnuplot-palettes-master/'
#load 'blues.pal'
unset key
set size .5, .5
set origin .2, .2
set border 3 lt 2 linewidth 4
set label "at fist 0.9,0.9" at first 0.9, 0.9 tc ls 3
set label "at second 0.9,0.9" at second 0.9, 0.9 tc ls 4 rotate by 45
set label "at graph 0.9,0.9" at graph 0.9, 0.9 tc ls 5
set label "at screen 0.9,0.9" at screen 0.9, 0.9 tc ls 6 rotate by -90
set label "at character 0.9,0.9" at character 1,1 tc ls 7
plot [0:3.14] sin(x)
Datos:
Ejecución del script:
Yo@miPC:mi/dir/graficos>gnuplot -c ayuda6.gp
Las dimensiones del canvas se determinan con el comando (para el caso de un png de ancho 300 y alto 500)
set terminal png size 300, 500
En cambio las dimensiones del diagrama mismo son determinadas con la fracción decimal del espacio que se desea ocupar del canvas:
set size 0.8, 0.8
Con la orden anterior se establece que el diagrama ocupará solo el 80% y el 80% del diagrama, respectivamente.
La posición del diagrama con respecto a la esquina inferior izquierda del canvas puede establecerse con la fracción de las repectivos ancho y alto del canvas:
set origin .1, .1
Con "set margins" se puede variar hasta cierto punto, el ancho de los márgenes.
set margins 1,1,1,1 # <left>, <right>, <bottom>, <top>
El valor de los márgenes se da en "ancho" y "alto" del tipo de letra default. Cuando no es posible mover el diagrama tanto, gnuplot interrumpe la ejecución del script y envía un mensaje de error.
Finalmente, con "set borders" se puede determinar las características del borde del diagrama.
set border 3 lt 2 linewidth 4
El valor de "lt 2", abreviatura de "linetype 2", es conocido solo por gnuplot. Normalmente se utiliza solo después de ser definido por el usuario. O se confía en gnuplot. En este caso tiene un color verde y es una línea continua. Con "linewidth 4" definimos el espesor de la línea que enmarca el diagrama y con un "3" (=1+2) determinamos que solo se trace el lado 1 (abajo) y el 2 (izq). El lado derecho (8) y el trazo superior (4) no son dibujados. Cuando todos los lados deben ser dibujados, el parámetro toma el valor 15 (=1+2+4+8).
La palabra "columna" tiene en gnuplot varias acepciones.
Gnuplot tiene también una columna con la ubicación "0" cuyos valores ($0) son los ordinales de la columna 1°, 2°, 3°, etc.
Podemos utilizar los valores de una columna para rotular los ticks (subdivisiones) de un eje de coordenadas.
Script ayuda8.gp:
set terminal png truecolor size 280, 320 font "Helvetica, 10" background rgb "white"
set margins 9,3,3,4 # <left>, <right>, <bottom>, <top>
set output 'gnuplot-ayuda8.png'
set grid
set yrange [0:]
set xlabel "mes"
set ylabel "Caudal (m³/s)"
set title "Curvas de variación estacional de\ncaudales promedio mensual en m³/s\n{/:Bold Río Tinguiririca} en Los Olmos" offset 0,-0.5
set style data line
set xtics offset -1.7,graph -0.06 rotate by 45
set key autotitle columnhead textcolor variable samplen 1 spacing 1 left top
plot for [n=3:8] 'ayuda3.dat' using (column(n)):xticlabels(1) with linespoints
Datos:
Ejecución del script:
Yo@miPC:mi/dir/graficos>gnuplot -c ayuda8.gp
maxrows 3
con lo que la leyenda es escrita en una sola columna de 6 filas.for [n=3:8]
using (column(n)):xticlabels(1)
Es importante presentar los diagramas en una forma agradable y clara al lector. Para ello, uno de los trabajos es elegir bien los colores, lo que no es fácil ni siempre coronado por el éxito. Por eso se recomienda usar lo obrado por otros que se han preocupado especialmente de ese tema.
La página https://github.com/Gnuplotting/gnuplot-palettes ofrece el archivo master.zip que contiene suficientes combinaciones de colores y las definiciones necesarias para ser usadas en tu diagrama.
Ahora veremos como crear en un canvas varios diagramas, en este caso con algunos de las combinaciones de colores que tienes a disposición con master.zip.
Script ayuda9.gp:
set terminal png truecolor size 300, 500
set output 'gnuplot-ayuda9.png'
set loadpath 'gnuplot-palettes-master/'
unset key
unset tics
unset border
set multiplot title "Combinaciones de colores\ndisponibles en Github" layout 4,3
do for [name in "brbg blues orrd greens sand reds greys pastel2 bupu pubu ylorrd chromajs"] {
load name.".pal"
set title name
plot for [n=1:10] 0.02*n linestyle n linewidth 4
}
unset multiplot
Datos:
plot for [n=1:10] 0.02*n linestyle n linewidth 4
Todos los ríos son importantes en su contexto. Sin embargo, es difícil comparar sus caudales porque varían entre varios órdenes de magnitud. El río Lluta tiene un caudal de 2 m³/s y el Río Baker más de 800 m³/s. El resultado es que en un diagrama simple no es posible apreciar los caudales de los ríos más pequeño.
En ese caso se puede agregar a cada barra, que expresa visualmente el caudal de ese río, el valor que representa la barra.
Script: ayuda10.gp | Datos: ayuda10.dat | Diagrama creado: gnuplot-ayuda10.png |
reset
data='ayuda10.dat'
set terminal png truecolor size 700, 500 font "Helvetica, 10" background rgb '#E0FFFF'
set output "gnuplot-ayuda10.png"
set xlabel "Ríos de Chile, de norte a sur."
set ylabel "Caudal [m/s³]"
set yrange [0:1000] # 10000 para diagrama logarítmico
set margins 10,3,6,4 # <left>, <right>, <bottom>, <top>
set xtics offset 0 rotate by -45
set style fill solid
set boxwidth 0.5
set grid
unset key
set title "{/:Bold Cuadro comparativo de caudales de ríos de Chile}"
# set logscale y
plot data using (column(2)):xticlabels(1) with boxes fillstyle solid 1.0 fillcolor "#4682B4" ,\
data using 0:($2+.1):(sprintf("%3.2f",$2)):5 with labels rotate variable offset 0,1.5 notitle
|
# https://www.cepal.org/samtac/noticias/documentosdetrabajo/8/23338/InCh01100.pdf
# Valores característicos de caudales en las principales cuencas de Chile
# Río Q(50%) Q(80%) m3/s # Río rotate angle
Lluta 2.03 1.38 Lluta 90
Lauca 0.35 0.44 Lauca 90
Camarones 0.49 0.57 Camarones 90
Loa 2.32 1.37 Loa 90
Salado 0.39 0.53 Salado 90
Copiapó 1.21 0.69 Copiapó 90
Huasco 3.47 1.37 Huasco 90
Elqui 7.49 3.70 Elqui 90
Hurtado 1.38 0.41 Hurtado 90
Grande 7.16 2.75 Grande 90
Illapel 2.23 0.89 Illapel 90
Choapa 6.28 2.07 Choapa 90
Alicahue 1.06 0.45 Alicahue 90
Aconcagua 30.60 19.8 Aconcagua 90
Putaendo 6.98 3.51 Putaendo 90
Maipo 102.00 70.2 Maipo 90
Mapocho 5.58 3.07 Mapocho 90
Tinguiririca 46.40 34.3 Tinguiririca 90
Teno 50.80 33.8 Teno 90
Maule 256.00 186 Maule 90
Claro 64.20 41.7 Claro 90
Itata 45.00 31.0 Itata 90
Chillán 14.40 10.3 Chillán 90
Ñuble 110.00 70.0 Ñuble 90
Laja 175.00 128 Laja 90
Biobio 400.00 330 Biobio 90
Malleco 28.00 22.0 Malleco 90
Quepe 34.00 25.0 Quepe 90
Cautin 102.00 78.0 Cautin 90
Toltén 270.00 210 Toltén 90
"San Pedro" 412.00 323 San_Pedro 90
Bueno 450.00 350 Bueno 90
Futalefu 326.00 263 Futalefu 90
Palena 110.00 76.0 Palena 90
Blanco 306.00 249 Blanco 90
Baker 828.00 703 Baker 90
Pascua 625.00 590 Pascua 90
|
Los nuevos mandatos son: