Python para oceanógrafos/Exemplos

Exemplos de programas para Oceanografia em python:

Plot de perfis

editar

Neste 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

editar

O 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: