513372 - Linux, Scripts y GMT

CLASE 9 - símbolos y texto en GMT

back

9.0 símbolos y texto: psxy y pstext

Se usa psxy para graficar símbolos en un mapa de 2D, y pstext para insertar texto.

Los ejemplos abajo son para graficar símbolos sobre un mapa que ya fue creado, tal que las líneas de código dadas acá no son scripts enteros, hay que agregarlas al script ya creado en la clase 8. Note que cuándo se pone más código en uno de estos scripts, hay que verificar las opciónes -K y -O dentro de los comandos:

• -K significa que más postscript sera agregado al .ps más tarde, o si no se termina el .ps. Entonces -K debe estar en todos los comandos usados salvo el último.
• -O significa que lo que grafica el comando va sobre el .ps ya creado. Si no, un nuevo gráfico sera creado. Entonces -O debe ser en todos los comandos usados salvo el primero.

9.1 agregando un símbolo a un mapa

Si quiero poner un símbolo a un mapa, uso psxy. Por ejemplo, para poner un símbolo que identifique la ciudad de Concepción en un mapa, puedo poner esta línea de código al final del script ejemplo_mapa3.sh.

            echo -73.03 -36.83 | psxy -J${projection} -R${bounds} ${verbose} -Ss1.0c -W0.2c/255/0/200 -G255/175/0 -O >> ${psfile}

Esto toma un punto de longitud y latitud (en nuestro caso la UdeC) y lo grafica como un cuadrado de 1.0 centímetro de tamaño (-Ss1.0c), de un color naranjo (-G255/175/0), con bordes de 0.2 centímetros de ancho , y de color púrpura (-W0.2c/255/0/0).

Hay varios símbolos disponibles, por ejemplo círculo (-Sc), cruz (-Sx), rombo (-Sd), hexágono (-Sh), estrella (-Sa), triángulo (-St), triángulo invertido (-Si) entre otros. Juege con uno de ellos, y también pruebe modificar los colores y el borde para que se vea en otra.

9.2 agregando texto

Para poner texto a un gráfico, por ejemplo, para poner "Concepción" al lado del símbolo de la ciudad, usamos pstext.

        echo "-72.8 -36.83 12 0 4 LM Concepci\363n" | pstext -J${projection} -R${bounds} ${verbose} -G0 -N -W255 -O >> ${psfile}

Esto requiere un poco de explicación:

• La longitud y latitud dónde se requiere empezar el texto están dadas por -72.8 -36.83
• El 12 significa el tamaño de las letras
• El 0 es el ángulo del texto (en nuestro caso, horizontal)
• El 4 es el font Times-Roman. Para una lísta de los fonts disponibles, escribe pstext -L en un terminal
• El LM significa que el punto donde queremos el text (dado por 
-72.8 -36.83) esta al lado izquierdo (L), al medio (M), del bloque de texto. Las opciones estan left/centre/right (LCR) y bottom/middle/top (BMT).

Por ejemplo, los tres puntos en el gráfico representan LB, CT, RM.
• Para poner carácteres especiales, hay que usar un código octal: CODIGOS OCTALES EN GMT
El default es ISOLatin+, así que \363 representa la letra "ó", \341 representa la letra "á", etc.
• -G0 significa que el color del texto es negro
• -W255 pone un rectángulo de color blanco bajo el texto
• -N significa que el texto puede existir fuera de los bordes del gráfico (si no, va a estar cortado por el borde - revisa eso cambiando la posición del texto.)

9.3 Agregando líneas

Usamos psxy de nuevo para poner líneas entre dos (o más) puntos. -W selecciona el ancho (aquí 2.0 puntos) de la linea y su color, -A significa que la línea es recta, y no un arco de un gran círculo entre los puntos. El ejemplo abajo va a dibujar una línea negra debajo del texto en la sección 9.2.

psxy -J${projection} -R${bounds} ${verbose} -W2.0p/0/0/0 -A -O << END >> ${psfile}
-72.8 -36.9
-72.3 -36.9
END

También  podemos tener un archivo con los puntos donde queremos nuestra línea y graficar eso con psxy. Por ejemplo, el archivo biobio_region.xy contiene la información sobre las fronteras de la región del Bío Bío. Podemos graficarlo con

psxy biobio_region.xy -J${projection} -R${bounds} ${verbose} -m -W1.0p/0/0/0t5_2:2 -A -O >> ${psfile}

Note que el archivo biobio_region.xy expresa dos líneas, una para la frontera al norte, después una pausa de 1 línea, después la frontera del sur. Por eso uso la opción -m para un "multiple segment file", o un archivo de multiples segmentos. Note también que esta línea tiene textura (t5_2:2). Eso significa que tenemos una línea con 5 puntos de segmento y 2 puntos de espacio, con un desplazamiento de 2 puntos de su inicio. (Esto es difícil de explicar, mejor  prueben diferentes combinaciones, como t5_2:0, t2_5:2, e incluso t2_2_8_2:1). Para más información, lean la página SPECIFYING PEN ATTRIBUTES

9.4 Agregando vectores

Para poner un vector al gráfico, uso

echo "-73.9 -36.5 80 2" | psxy -J${projection} -R${bounds} ${verbose} -SV0.075c/0.3c/0.15c -G0 -O >> ${psfile}

Los números son la longitud y latitud del vector, el azimut del vector, y su largo en centímetros. Aquí estoy usando psxy con la opción -SV para un vector. Los números asociados con el -SV son el ancho del vector (0.075 centímetros), el ancho de la flecha (0.3 centímetros), y el largo de la flecha (0.15 centímetros). Prueben eso con diferentes valores. La opción -G da el color del vector, en nuestro caso, negro.

Esta flecha representa la velocidad de la placa Nazca, podemos agregar texto a su lado para especificar eso:

echo "-73.9 -36.6 12 0 6 LM Nazca Plate" | pstext -J${projection} -R${bounds} $verbose} -G0 -N -W255 -O -K >> ${psfile}
echo "-73.9 -36.69 12 0 6 LM ~80 mm/yr" | pstext -J${projection} -R${bounds} ${verbose} -G0 -N -W255 -O >> ${psfile}

9.5 El script

El script que hace eso esta disponible aquí: ejemplo_mapa4.sh. Note que este script también tiene una opción para el color de los lagos. Es posible limpiar el script con  condicionales, como lo que se hizo con la topografía.

El script debe producir un gráfico como este :



Aquí esta el script en full:

#!/bin/bash

topo_option=1
    illumination_option=1
    contour_option=0
    topo_scale_option=1

####################################################################################################

region="ejemplo_mapa4"
bounds="-74.5/-71/-38.5/-36"

#origin:
    xshift="2.0"
    yshift="6.0"

projection="M14.0"                 #projection
palette="/home/matt/GMT/GMT4.5.2/share/cpt/GMT_globe.cpt"   # colour palette
topography="/home/matt/GMT/TOPO_FILES/SRTM30/w100s10.Bathymetry.srtm.grd"    #topography file
ticks="a2f0.5g1SEWN"
illaz="225"     # illumination azimuth
portrait="-P"    # set this to be blank for the default landscape mode
verbose="-V"    # set this to be blank to suppress output to stderr

# coastline and border information --- see pscoast manpage for details
coastline="1.00p/0/0/0"
resolution="f"    # choose from (f)ull, (h)igh, (i)ntermediate,
        # (l)ow, and (c)rude
borders="-N1/1.00p/0/0/0"
#rivers="-I1/1.00p/0/0/255"

 wet="-S0/0/255"
   
 land="-G0/255/0"
       
lakes="-C50/100/200 -A0/2/4"

########################################################################################################

# output file
psfile="${region}.ps"

# make a basemap (blank b/g), insert grid image and plot coastlines
psbasemap -B${ticks} -J${projection} -R${bounds} -X${xshift} -Y${yshift} ${portrait} ${verbose} -K > ${psfile}

if [ "${topo_option}" = 1 ]; then
#grdcut input_file.grd −Goutput_file.grd −Rwest/east/south/north[r] [ −V ] [ −f[i|o]colinfo ]
#cuts the grid to the specific region
grdcut ${topography} -G${region}.grd -R${bounds} -V

    if [ "${illumination_option}" = 1 ]; then
    # illuminate the grid file from specified azimuth to produce an
    # intensity (.int) file
    grdgradient ${region}.grd -G${region}.int -A${illaz} -Nt -M
    # insert topography
    grdimage ${region}.grd -C${palette} -I${region}.int -B${ticks} -J${projection} -R${bounds} ${portrait} ${verbose} -O -K >> ${psfile}
    else
    grdimage ${region}.grd -C${palette} -B${ticks} -J${projection} -R${bounds} ${portrait} ${verbose} -O -K >> ${psfile}
    fi

    if [ "${contour_option}" = 1 ]; then
    grdcontour ${region}.grd -B${ticks} -J${projection} -C200 -A1000+k0/0/0 -R${bounds} ${portrait} ${verbose} -W0.1p/0/0/0 -Gd10c -O -K >> ${psfile}
    fi

    if [ "${topo_scale_option}" = 1 ]; then
    psscale  -D16c/2.5c/5c/0.5c -C${palette} -Ba5000f1000/a5000f1000:"(m)": -O -K >> ${psfile}
    fi
pscoast -B${ticks} -J${projection} -R${bounds} ${portrait} ${verbose} -D${resolution} -W${coastline} ${borders} ${rivers}  -O -K >> ${psfile}
pscoast -B${ticks} -J${projection} -R${bounds} ${portrait} ${verbose} ${lakes} -D${resolution} -W${coastline} ${borders} ${rivers}  -O -K >> ${psfile}
else
pscoast -B${ticks} -J${projection} -R${bounds} ${portrait} ${verbose} -D${resolution} -W${coastline} ${borders} ${rivers} ${wet} ${land} -O -K >> ${psfile}
pscoast -B${ticks} -J${projection} -R${bounds} ${portrait} ${verbose} ${lakes} -D${resolution} -W${coastline} ${borders} ${rivers} -O -K >> ${psfile}
fi

#############################################################################################

#ahora vamos a poner unos simbolos
#poner una cuadra para la ciudad de concepcion
echo "-73.03 -36.83" | psxy -J${projection} -R${bounds} ${verbose} -Ss1.0c -W0.2c/255/0/200 -G255/175/0 -O -K >> ${psfile}
#poner texto que dice concepcion
echo "-72.8 -36.83 12 0 4 LM Concepci\363n" | pstext -J${projection} -R${bounds} ${verbose} -G0 -N -W255 -O -K >> ${psfile}
#poner una línea bajo del texto
psxy -J${projection} -R${bounds} ${verbose} -W2.00p/0/0/0 -A -O -K << END >> ${psfile}
-72.8 -36.9
-72.3 -36.9
END
#poner la frontera de la region biobio
psxy biobio_region.xy -J${projection} -R${bounds} ${verbose} -m -W1.0p/0/0/0t5_2:1 -A -O -K >> ${psfile}
#poner un vector para la velocidad de la placa Nazca
echo "-73.9 -36.5 80 2" | psxy -J${projection} -R${bounds} ${verbose} -SV0.075c/0.3c/0.15c -G0 -O -K >> ${psfile}
#y texto
echo "-73.9 -36.6 12 0 6 LM Nazca Plate" | pstext -J${projection} -R${bounds} $verbose} -G0 -N -W255 -O -K >> ${psfile}
echo "-73.9 -36.69 12 0 6 LM ~80 mm/yr" | pstext -J${projection} -R${bounds} ${verbose} -G0 -N -W255 -O >> ${psfile}

Próxima semana: volcanes, terremotos, mecanismos focales, áreas, indent maps

back