Python para oceanógrafos/Exemplos
Exemplos de programas para Oceanografia em python:
Plot de perfis
editarNeste exemplo, vamos plotar um perfil de temperatura do oceano:
A primeira linha do código que iremos escrever é a importação da biblioteca pylab. Com ela, será possível fazer com que o Python desenhe o perfil:
import pylab # importando a biblioteca PyLab
Feito isso, vamos então montar os vetores de dados de temperatura e suas respectivas profundidades. Aqui, vamos utilizar dados obtidos do WOA09 (grade de 5°), na latitude -27,5 e longitude -37,5. Para mais informações sobre o WOA09, clique aqui:
temp = [23.4859, 23.4130, 23.2890, 23.1366, 22.4640, 21.1481, 20.1275, 19.2069, 18.2899, 16.6416, 15.4535, 14.5209, 12.7510, 10.6054, \ 8.3869, 6.4448, 5.0789, 4.2432, 3.7263, 3.3810, 3.1703, 3.0694, 3.0519, 3.0522, 3.1440, 3.1527, 3.0166, 2.7636, 2.2191, 1.1146, 0.2896]; # Vetor temperatura prof = [0, 10, 20, 30, 50, 75, 100, 125, 150, 200, 250, 300, 400, 500, 600, 700, 800, 900, 1000, 1100,\ 1200, 1300, 1400, 1500, 1750, 2000, 2500, 3000, 3500, 4000, 4500]; # Vetor profundidade
O uso da \ na construção dos vetores é só para quebrar a linha do comando para fins de visualização do código.
Bom, agora vamos plotar os dados. Para isso, vamos utilizar o comando plot e show da biblioteca pylab:
pylab.plot(temp, prof, label='Temp') pylab.show()
Isso vai fazer com que seja desenhado uma linha em azul ligando os pares temperatura X profundidade. O resultado será esse:
Como dá para perceber, o perfil já está desenhado, porém ainda mal apresentado (i.e. sem título, labels, unidades das variáveis, orientação dos eixos etc). Para melhorar a aparência do gráfico vamos adicionar alguns comandos:
import pylab temp = [23.4859, 23.4130, 23.2890, 23.1366, 22.4640, 21.1481, 20.1275, 19.2069, 18.2899, 16.6416, 15.4535, 14.5209, 12.7510, 10.6054, \ 8.3869, 6.4448, 5.0789, 4.2432, 3.7263, 3.3810, 3.1703, 3.0694, 3.0519, 3.0522, 3.1440, 3.1527, 3.0166, 2.7636, 2.2191, 1.1146, 0.2896]; # Vetor temperatura prof = [0, 10, 20, 30, 50, 75, 100, 125, 150, 200, 250, 300, 400, 500, 600, 700, 800, 900, 1000, 1100,\ 1200, 1300, 1400, 1500, 1750, 2000, 2500, 3000, 3500, 4000, 4500]; # Vetor profundidade pylab.plot(temp, prof, label='Temp') xmin=min(temp); # acha o valor mínimo da temperatura xmax=max(temp); # acha o valor máximo da temperatura pylab.xlim(xmin-((xmax-xmin)*0.05), xmax+((xmax-xmin)*0.05)); """ informa os intervalos de temperatura a serem apresentados no plot. So para deixar um espaço, evitando que a linha do perfil fique colada aas bordas do grafico """ ymin=min(prof); # acha o valor mínimo da profundidade ymax=max(prof); # acha o valor máximo da profundidade pylab.ylim(0, ymax+((ymax-ymin)*0.1)); # alterando os intervalos da profundidade. O valor zero costuma ser o inicio. Sem espaco na parte superior do perfil. pylab.xlabel('Temperatura ($^\circ$C)') # label do eixo X pylab.ylabel('Profundidade (m)') # label do eixo Y pylab.title('Perfil de Temperatura') # titulo do grafico pylab.grid(True) # colocando uma grade pylab.gca().invert_yaxis() # invertendo a orientacao do eixo Y, assim, o topo será o menor valor (''i.e.'' zero) e a base será o maior valor de profundidade. pylab.legend(loc=4) # inserindo uma legenda para o perfil. A opcao loc=4 intrui o Python a colocar a legenda no canto inferior direito. pylab.show()
O resultado final será o seguinte:
Diagrama TS
editarO Diagram TS é uma importante ferramenta gráfica para os oceanógrafos. Neste exemplo, vamos construir um diagrama TS com valores obtidos do WOA09, no mesmo ponto de grade do exemplo Plot de perfis.
Além da biblioteca pylab, vamos também importar o pacote de rotinas Gibbs Sea Water. Para instalação e mais informações sobre essa toolbox, clique aqui. Se quiser saber mais sobre a Thermodynamic Equation Of Seawater - 2010 (TEOS-10), clique aqui:
import pylab # importando a biblioteca PyLab from seawater.gibbs import * # importando a biblioteca Gibbs Sea Water
Vamos agora fornecer os dados de temperatura e salinidade para a construção do diagrama:
temp = [23.4859, 23.4130, 23.2890, 23.1366, 22.4640, 21.1481, 20.1275, 19.2069, 18.2899, 16.6416, 15.4535, 14.5209, 12.7510, 10.6054, \ 8.3869, 6.4448, 5.0789, 4.2432, 3.7263, 3.3810, 3.1703, 3.0694, 3.0519, 3.0522, 3.1440, 3.1527, 3.0166, 2.7636, 2.2191, 1.1146, 0.2896] sal = [36.3923, 36.3707, 36.3762, 36.3995, 36.4141, 36.3823, 36.2633, 36.1235, 35.9743, 35.7269, 35.5702, 35.4497, 35.1857, 34.8950, \ 34.6285, 34.4319, 34.3314, 34.3130, 34.3387, 34.3865, 34.4492, 34.5187, 34.5901, 34.6574, 34.7908, 34.8745, 34.9254, 34.9204, 34.8727, 34.7555, 34.6795]
Agora uma parte que vai caracterizar o diagrama TS: o plot das isopicnais:
sal_vet = linspace(32,38,100) # vetor salinidade temp_vet = linspace(-2,32,100) # vetor temperatura [S,T] = meshgrid(sal_vet,temp_vet) # criando a malha do campo temperatura e salinidade DENS = rho(S,T,0) # obtendo a densidade a partir dos valores de temperatura e salinidade, considerando a profundidade=0 m.
O que foi feito aqui é a criação dos campos de temperatura, salinidade e calculando o campo de densidade a partir das equações da TEOS-10. Com isso, é possível criar um gráfico com as isolinhas de densidade. Isso ficará como o fundo do diagrama. Além disso, vamos plotar por cima destas isopicnais os pares TS representados por círculo azuis:
CS = pylab.contour(S,T,DENS,20,colors='0.5') # contornado o gráfico com isolinhas de densidade pylab.clabel(CS, inline=1, fontsize=10) # inserindo os valores de densidade nas linhas contornadas pylab.plot(sal, temp,'o', label='TxS') # plotando os pares TS
Para finalizar, vamos "arrumar" o diagrama para que ele fique um pouco mais apresentável e plotá-lo:
xmin=min(sal); xmax=max(sal); pylab.xlim(xmin-((xmax-xmin)*0.15), xmax+((xmax-xmin)*0.15)); ymin=min(temp); ymax=max(temp); pylab.ylim(ymin-((ymax-ymin)*0.15), ymax+((ymax-ymin)*0.15)); pylab.xlabel('Salinidade') pylab.ylabel('Temperatura ($^\circ$C)') pylab.title('Diagrama TS') pylab.show()
O resultado final será o seguinte: