VOLTAR

In [4]:
%matplotlib inline
In [5]:
# ESTE TUTORIAL ENSINARÁ A COMO FAZER UM MAPA DE ÁREA DE ESTUDO COM BATIMETRIA UTILIZANDO O PYTHON

# A Rotina resultante do tutorial 01:

# IMPORTANDO MÓDULOS
import numpy as np # módulo de funções matemáticas
from mpl_toolkits.basemap import Basemap # módulo de mapas
import matplotlib.pyplot as plt #módulo de criação de imagens

# DEFININDO LIMITES DO MAPA
longitude_min,longitude_max = -53.5,-44.0 #aqui aumentamos o tamanho
latitude_min,latitude_max   = -04.0, 04.0 #do mapa

# Cria uma figura
plt.figure(figsize=(10,10)) #aqui definimos um tamanho maior para a figura
# Cria o mapa
M = Basemap(llcrnrlon=longitude_min, llcrnrlat=latitude_min, 
            urcrnrlon=longitude_max, urcrnrlat=latitude_max,
            resolution='h',projection='merc')

# Preenchimento dos continentes
M.fillcontinents(color='#BDA973');
# Linhas de costa
M.drawcoastlines(linewidth=1);

# Meridianos e Paralelos
lbs=[1, 0, 0, 1]
M.drawmeridians(range(-180,180,2),labels=lbs);
M.drawparallels(range(-90,90,2),labels=lbs);

# Rios
M.drawrivers(color='w');

# Escala
M.drawmapscale(-47,-3,-49,0,200,barstyle='fancy',fontsize=12);

# Definindo coordenadas dos pontos de coleta
plon,plat = [-47.5,-48.5,-48.8,-49],[0.2,0.21,0.6,1.2]

# Plotando
M.scatter(plon,plat,s=80,color='red',latlon=True,label='Coleta');

# Criando legenda
plt.legend(fontsize=15,scatterpoints=1,loc='lower left');
In [10]:
# A idéia deste tutorial é plotar, junto com o mapa acima, linhas preenchidas de batimetria
# Para isso utilizaremos a função download_bathy do pacote OceanLab

from OceanLab.utils import download_bathy

# Antes de usarmos qualquer função pela primeira vez, obervamos a sua documentação
help(download_bathy)
Help on function download_bathy in module OceanLab.utils:

download_bathy(lnd=-49, lnu=-33, ltd=-34, ltu=-20)
    This function downloads ETOPO1 data and make subset.
    
    lnd: lowest  longitude limit
    ltd:   "     latitude    "    
    
    lnu: highest longitude limit
    ltu:    "    latitude    "

In [11]:
# A documentação não é das melhores. Deveria ser informados quais outputs esta função retorna
# Como fui eu quem fez essa função, acredite em mim que o retorno é LON,LAT,BAT 
# Ou seja, lontitudes, latitudes e suas respectivas profundidades

bLON,bLAT,BAT = download_bathy(lnd=longitude_min,lnu=longitude_max,
                               ltd=latitude_min,ltu=latitude_max )

# Isso pode demorar um pouco, então aconselha-se você salvar estes dados
In [14]:
# Para salvar os dados utilize a função save_pickle do pacote utils do OceanLab
from OceanLab.utils import save_pickle
help(save_pickle)
Help on function save_pickle in module OceanLab.utils:

save_pickle(obj, name)
    Save python object as pickle binary.

In [15]:
# Para salvar criaremos um dicionário com as variáveis
BDATA = dict(LON=bLON,LAT=bLAT,BAT=BAT)
save_pickle(BDATA,'/home/iury/Downloads/'+'minha_batimetria')
In [19]:
# Para plotar estes dados basta fazer
plt.figure() #cria a figura
plt.contourf(bLON,bLAT,BAT);
plt.colorbar();
In [27]:
# Mas não queremos plotar de qualquer forma
# vamos importar o pacote de cores criado por Kristen M. Thyng
from cmocean import cm
# Então selecionaremos alguns argumentos para este plot
kw = dict(levels=range(-4500,0+100,100),cmap=cm.bathymetry_r)

plt.figure() #cria a figura
plt.contourf(bLON,bLAT,BAT,**kw); #o **kw colocará cada um dos argumentos dentro da função
plt.colorbar();
In [37]:
# Precisamos adicionar linhas batimétricas
Ct = plt.contour(bLON,bLAT,BAT,[-4000,-3000,-500,-10],colors='k')
# Para colocar os valores nas linhas faremos
plt.clabel(Ct,fmt='%i') #fmt dará a formatação dos valores
                       #no caso, %i são inteiros
Out[37]:
<a list of 4 text.Text objects>
In [38]:
# Vamos ver como ficam com os contornos preenchidos de antes

#alguns argumentos para este plot
kw = dict(levels=range(-4500,0+100,100),cmap=cm.bathymetry_r)

plt.figure() #cria a figura
plt.contourf(bLON,bLAT,BAT,**kw); #o **kw colocará cada um dos argumentos dentro da função
plt.colorbar();
# Precisamos adicionar linhas batimétricas
Ct = plt.contour(bLON,bLAT,BAT,[-4000,-3000,-500,-10],colors='k')
# Para colocar os valores nas linhas faremos
plt.clabel(Ct,fmt='%i') #fmt dará a formatação dos valores
                       #no caso, %i são inteiros
Out[38]:
<a list of 4 text.Text objects>
In [40]:
# Eu, particularmente, não gosto quando as linhas negativas são tracejadas
# Para mudar isso:
import matplotlib
matplotlib.rcParams['contour.negative_linestyle'] = 'solid'

#alguns argumentos para este plot
kw = dict(levels=range(-4500,0+100,100),cmap=cm.bathymetry_r)

plt.figure() #cria a figura
plt.contourf(bLON,bLAT,BAT,**kw); #o **kw colocará cada um dos argumentos dentro da função
plt.colorbar();
# Precisamos adicionar linhas batimétricas
Ct = plt.contour(bLON,bLAT,BAT,[-4000,-3000,-500,-10],colors='k')
# Para colocar os valores nas linhas faremos
plt.clabel(Ct,fmt='%i') #fmt dará a formatação dos valores
                       #no caso, %i são inteiros
Out[40]:
<a list of 4 text.Text objects>
In [41]:
# Agora veja que está um pouco difícil de ler os valores, Para isso
# vamos colocar um contorno branco em volta do texto, além de aumentá-lo

import matplotlib.patheffects as PathEffects

#alguns argumentos para este plot
kw = dict(levels=range(-4500,0+100,100),cmap=cm.bathymetry_r)

plt.figure() #cria a figura
plt.contourf(bLON,bLAT,BAT,**kw); #o **kw colocará cada um dos argumentos dentro da função
plt.colorbar();
# Precisamos adicionar linhas batimétricas
Ct = plt.contour(bLON,bLAT,BAT,[-4000,-3000,-500,-10],colors='k')
# Para colocar os valores nas linhas faremos
clbls = plt.clabel(Ct,fmt='%i') #fmt dará a formatação dos valores
                       #no caso, %i são inteiros
    
plt.setp(clbls, path_effects=[PathEffects.withStroke(linewidth=3, foreground="w")])
Out[41]:
[None, None, None, None]
In [6]:
# Agora vamos adicionar ao mapa do tutorial anteriror:


# IMPORTANDO MÓDULOS
from OceanLab.utils import load_pickle #ler dados
import matplotlib.patheffects as PathEffects #colocar contorno em texto
import numpy as np # módulo de funções matemáticas
from mpl_toolkits.basemap import Basemap # módulo de mapas
import matplotlib.pyplot as plt #módulo de criação de imagens
import matplotlib #mudando contornos negativos para linhas sólida
matplotlib.rcParams['contour.negative_linestyle'] = 'solid' 
from cmocean import cm #importando pacote de colormaps

# DEFININDO LIMITES DO MAPA
longitude_min,longitude_max = -53.5,-44.0 #aqui aumentamos o tamanho
latitude_min,latitude_max   = -04.0, 04.0 #do mapa

# Para ler os dados salvos de batimetria
BDATA = load_pickle('/home/iury/Downloads/'+'minha_batimetria')
bLON,bLAT,BAT = BDATA['LON'],BDATA['LAT'],BDATA['BAT']

# Cria uma figura
plt.figure(figsize=(12,6)) #aqui definimos um tamanho maior para a figura
# Cria o mapa
M = Basemap(llcrnrlon=longitude_min, llcrnrlat=latitude_min, 
            urcrnrlon=longitude_max, urcrnrlat=latitude_max,
            resolution='h',projection='merc')

# Preenchimento dos continentes
M.fillcontinents(color='#BDA973');
# Linhas de costa
M.drawcoastlines(linewidth=1);
# Meridianos e Paralelos
lbs=[1, 0, 0, 1]
M.drawmeridians(range(-180,180,2),labels=lbs);
M.drawparallels(range(-90,90,2),labels=lbs);
# Rios
M.drawrivers(color='w');
# Escala
M.drawmapscale(-47,-3,-49,0,200,barstyle='fancy',fontsize=12);
# Definindo coordenadas dos pontos de coleta
plon,plat = [-47.5,-48.5,-48.8,-49],[0.2,0.21,0.6,1.2]
# Plotando
M.scatter(plon,plat,s=80,color='red',latlon=True,
          label='Coleta',zorder=1e+4);
# o zorder diz que camada de plot fica acima de qual
# no caso, colocamos um valor absurdo (10000) para
# garantir que os pontos de coleta não sejam sobrepostos
# por outra coisa

# Criando legenda
plt.legend(fontsize=15,scatterpoints=1,loc='lower left');

#alguns argumentos para este plot
kw = dict(levels=range(-4500,0+100,100),cmap=cm.bathymetry_r,latlon=True)

Cf = M.contourf(bLON,bLAT,BAT,**kw); #o **kw colocará cada um dos argumentos dentro da função
cbar = plt.colorbar(Cf);
# Precisamos adicionar linhas batimétricas
Ct = M.contour(bLON,bLAT,BAT,[-4000,-3000,-500,-10],colors='k',latlon=True)
# Para colocar os valores nas linhas faremos
clbls = plt.clabel(Ct,fmt='%i') #fmt dará a formatação dos valores
                       #no caso, %i são inteiros
    
plt.setp(clbls, path_effects=[PathEffects.withStroke(linewidth=3, foreground="w")])

# Para colocar a unidade na colorbar
cbar.ax.set_ylabel('Z [m]') #precisamos acessar o objeto ax dentro de cbar
Out[6]:
<matplotlib.text.Text at 0x7f622d03ff90>
In [ ]:
# Pra salvar
plt.savefig('caminho/para/pasta/'+'nomedoarquivo.png',dpi=200)
# dpi define a resolução da imagem (use acima de 150)