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()
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()