Cómo hacer un Diagrama de Stiff Georeferenciado con Python3 y QGIS3?

Los Diagramas de Stiff son un aplicación muy común para representar la química de los recursos hídricos. En un Diagrama de Stiff las concentraciones de los componentes principales representados en miliequivalentes por litro (meq/l) son representados para una muestra. El perfil de los cationes son representados a la izquierda y los aniones a la derecha. 

El diagrama permite la comparación rápida de muchos componentes de la calidad del agua entre muchas muestras, mediante la comparación de las formas de los polígonos generados. Sin embargo, hasta ahora no había manera de correlacionar los diagramas con la posición del punto de monitoreo. Este tutorial muestra los códigos y pasos para la realización de un Diagrama de Stiff Georeferenciado utilizando QGIS 3 y Python 3. 

 

Video

 

Código

Este es el código principal en Python para el tutorial. Se recomienda descargar los archivos de entrada y colocarlos en “Mis Documentos” para que los paquetes anexos puedan ser importados sin problema.

Import the required libraries

Fot this tutorial we have developed two packages, one that stores some text for the style file (*.sld) and another that generates the Stiff format. There are required packages for the tutorial as pandas, re, and os.

%matplotlib inline
import pandas as pd
import numpy as np
import re, os

from funciones import *
from variables import *

Define the equivalent concentrations and open the chemistry data

The code converts component concentration to equivalent HCO3 weights and creates a columns with the calculated values for each sample.

#ion dictionary
iones = {
'HCO3': 61, 'CO3' : 30, 'Cl' : 35, 'SO4': 48,
'Na' : 23, 'Ca' : 20, 'Mg' : 12, 'K'  : 39
}

#chemistry dataframe
datosQuimica = pd.read_excel('../InputData/DatosDiagramaStiff.xlsx')

#replace incompatible characters
datosQuimica['Estacion'] = datosQuimica['Estacion'].str.replace("/","_")
datosQuimica['Estacion'] = datosQuimica['Estacion'].str.replace("–","-")
datosQuimica['Estacion'] = datosQuimica['Estacion'].str.replace(" |%/s","")
datosQuimica = datosQuimica.set_index(['Estacion'])

#equivalen weight colum
for ion in iones.keys():
    datosQuimica[str(ion)+'_meq'] = datosQuimica[ion]/iones[ion]

Generation of images files

This tutorial generates the Stiff diagram as Png and SVG files. In order to import the Stiff diagram in QGIS we need the image vector file SVG.

for index, row in datosQuimica.iterrows():
    Na_K, Ca, Mg = row['Na_meq']+row['K_meq'], row['Ca_meq'], row['Mg_meq'] 
    Cl, SO4, HCO3_CO3 = row['Cl_meq'], row['SO4_meq'], row['HCO3_meq']+row['CO3_meq']
    #apply some factor for the axis
    maxConNorm = max([Na_K, Ca, Mg, Cl, SO4, HCO3_CO3])*2
    #set of points of the Stiff diagram
    a = np.array([[0.5 + Cl/maxConNorm,1],[0.5 + SO4/maxConNorm,.5],[0.5 + HCO3_CO3/maxConNorm,0]
                  ,[0.5 - Mg/maxConNorm,0],[0.5 - Ca/maxConNorm,.5],[0.5 - Na_K/maxConNorm,1]])

    figura = diagramaStiff(a, maxConNorm, index)
    figura.savefig('../Svg/Stiff-'+str(index)+'.svg')
    figura.savefig('../Png/Stiff-'+str(index)+'.png')

Representation of the generated Stiff diagrams

A sample representation of the generated diagrams

import matplotlib.pyplot as plt
stiffObject = plt.imread('../Png/Stiff-CHA-01.png')
fig, ax = plt.subplots(figsize=(10,6))
ax.axis('off')
ax.imshow(stiffObject)
plt.show()
Stiff-CHA-01.png

Generation of spatial file and style file

The observation points with their coordinates are exported in one file and the Stiff diagrams are linked on a style file.

#observation point spatial file
datosQuimicaGeo = datosQuimica.loc[:,'Este':'Norte']
datosQuimicaGeo.to_csv('../Txt/datosQuimicaGeo.csv')
#path to the Svg folder
imagePath = os.path.join(os.path.dirname(os.getcwd()),'Svg')
imagePath = imagePath.replace('\\','/')
imagePath
'C:/Users/GIDAWK1/Documents/GeoreferencedStiffDiagramwithPythonandQGIS/Svg'
#style file generation
archivoestilos = open('../Txt/estilosQuimicaGeo.sld','w')
archivoestilos.write(encabezado)

for index, row in datosQuimica.iterrows():
    item = re.sub('%%path%%',imagePath,item)
    estiloitem = re.sub('%%index%%',index,item)
    archivoestilos.write(estiloitem)
archivoestilos.write(final)

archivoestilos.close()

Archivos

Descargue los archivos necesarios para este tutorial de este enlace.

 

Smiley face

Suscríbase a nuestro boletín gratuito para recibir noticias, datos interesantes y fechas de nuestros cursos en recursos hídricos.

Posted on October 4, 2016 and filed under Calidad de agua, TutorialQGIS, TutorialPython.