#!/usr/bin/env python
# coding: utf-8
# **Course website**: http://www.leouieda.com/geofisica1
#
# **Note**: This notebook is part of the course "Geofísica 1" of Geology program of the
# [Universidade do Estado do Rio de Janeiro](http://www.uerj.br/).
# All content can be freely used and adapted under the terms of the
# [Creative Commons Attribution 4.0 International License](http://creativecommons.org/licenses/by/4.0/).
#
# ![Creative Commons License](https://i.creativecommons.org/l/by/4.0/88x31.png)
# Esse documento que você está usando é um [Jupyter notebook](http://jupyter.org/). É um documento interativo que mistura texto (como esse), código (como abaixo), e o resultado de executar o código (números, texto, figuras, videos, etc).
# # Prática 4 - Gravimetria - Estudos de caso da anomalia da gravidade
# ## Objetivos
#
# * Observar a topografia, distúrbio e anomalia Bouguer de: Havaí, Baía de Hudson, Japão e costa brasileira.
# * Fixar os conceitos de distúrbio da gravidade, anomalia Bouguer e isostasia.
# * Fazer gráficos de perfis cortando as principais feições de cada alvo.
# * Analisar a relação entre a topografia, isostasia, anomalias e tectônica.
# ## Instruções
#
# O notebook te fornecerá exemplos interativos que trabalham os temas abordados no questionário. Utilize esses exemplos para responder as perguntas.
#
# As células com números ao lado, como `In [1]:`, são código [Python](http://python.org/). Algumas dessas células não produzem resultado e servem de preparação para os exemplos interativos. Outras, produzem gráficos interativos. **Você deve executar todas as células, uma de cada vez**, mesmo as que não produzem gráficos.
#
# Para executar uma célula, clique em cima dela e aperte `Shift + Enter`. O foco (contorno verde ou cinza em torno da célula) deverá passar para a célula abaixo. Para rodá-la, aperte `Shift + Enter` novamente e assim por diante. Você pode executar células de texto que não acontecerá nada.
# ## Preparação
#
# Exectute as células abaixo para carregar as componentes necessárias para nossa prática. Vamos utilizar várias *bibliotecas*, inclusive uma de geofísica chamada [Fatiando a Terra](http://www.fatiando.org).
# In[ ]:
get_ipython().run_line_magic('matplotlib', 'inline')
from __future__ import division
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import ipywidgets as widgets
from IPython.display import display, HTML
import seaborn
import fatiando
from fatiando.gravmag import normal_gravity
from fatiando import gridder
from icgem import load_icgem_gdf
# In[ ]:
print("Usando a versão do Fatiando: {}".format(fatiando.__version__))
# In[ ]:
def data_minmax(data):
"""Retorna vmin e vmax para que o valor 0 esteja no centro da escala de cor."""
ranges = np.abs([data.min(), data.max()]).max()
return dict(vmin=-ranges, vmax=ranges)
# # Havaí
#
# Nosso primeiro alvo é o Havaí:
#
# In[ ]:
HTML('')
# Primeiro precisamos carregar os dados de topografia e gravidade do Havaí que estão nos arquivos `data/eigen-6c3stat-havai.gdf` e `data/etopo1-havai.gdf`.
# In[ ]:
havai = load_icgem_gdf('../data/eigen-6c3stat-havai.gdf')
havai['topo'] = load_icgem_gdf('../data/etopo1-havai.gdf', usecols=[-1])['topography_shm']
# Agora posso calcular o distúrbio e a anomalia Bouguer.
# In[ ]:
havai['disturbio'] = havai['gravity_earth'] - normal_gravity.gamma_closed_form(havai['latitude'], havai['h_over_geoid'])
havai['bouguer'] = havai['disturbio'] - normal_gravity.bouguer_plate(havai['topo'], density_rock=2670, density_water=1040)
# Vamos os mapas das anomalias e da topografia usando a [projeção Mercator](http://en.wikipedia.org/wiki/Mercator_projection) e escalas de cor apropriadas.
# In[ ]:
s, n, w, e = havai['area']
havai_bm = Basemap(projection='merc', llcrnrlat=s, urcrnrlat=n, llcrnrlon=w, urcrnrlon=e,
lat_ts=0.5*(s + n), resolution='h')
# In[ ]:
x, y = havai_bm(havai['longitude'], havai['latitude'])
fig, axes = plt.subplots(1, 3, figsize=(14, 9))
ax = axes[0]
tmp = havai_bm.contourf(x, y, havai['topo'], 80, tri=True, ax=ax, cmap='BrBG_r',
**data_minmax(havai['topo']))
plt.colorbar(tmp, ax=ax, orientation='horizontal', pad=0.01, aspect=30, shrink=1).set_label('m')
havai_bm.drawcoastlines(ax=ax)
ax.set_title('Topografia')
ax = axes[1]
tmp = havai_bm.contourf(x, y, havai['disturbio'], 80, tri=True, ax=ax, cmap='RdBu_r',
**data_minmax(havai['disturbio']))
plt.colorbar(tmp, ax=ax, orientation='horizontal', pad=0.01, aspect=30, shrink=1).set_label('mGal')
havai_bm.drawcoastlines(ax=ax)
ax.set_title('Disturbio')
ax = axes[2]
tmp = havai_bm.contourf(x, y, havai['bouguer'], 80, tri=True, ax=ax, cmap='RdBu_r',
**data_minmax(havai['bouguer']))
plt.colorbar(tmp, ax=ax, orientation='horizontal', pad=0.01, aspect=30, shrink=1).set_label('mGal')
havai_bm.drawcoastlines(ax=ax)
ax.set_title('Anomalia Bouguer')
plt.tight_layout(pad=0, w_pad=0)
# Agora que temos os mapas, vamos ver como é o gráfico da **anomalia Bouguer pela topografia equivalente**.
#
# Lembrando que a topografia equivalente é:
#
# $$
# h_{eq} =
# \begin{cases}
# h & \quad \text{if } h \ge 0 \\
# h \frac{\rho_c - \rho_a}{\rho_c} & \quad \text{if } h < 0 \\
# \end{cases}
# $$
#
# em que $h$ é a topografia, $\rho_c$ é a densidade da crosta e $\rho_a$ é a densidade da água do mar.
# In[ ]:
heq = havai['topo'].copy()
heq[heq < 0] *= (2670 - 1040)/2670
plt.figure(figsize=(7, 7))
plt.title('Bouguer x Topografia - Havai')
plt.plot(heq, havai['bouguer'], '.k')
plt.xlabel('Topografia equivalente (m)')
plt.ylabel('Anomalia Bouguer (mGal)')
plt.tight_layout(pad=0)
# É muito útil olhar os dados alongo de um **perfil** que corte as principais feições dos mapas acima. Vamos estrair o perfil entre os pontos `p1` e `p2` definidos abaixo.
# In[ ]:
p1, p2 = havai_bm(197.5, 15), havai_bm(207, 27.5)
plt.figure(figsize=(8, 7))
ax = plt.subplot(111)
tmp = havai_bm.contourf(x, y, havai['topo'], 80, tri=True, ax=ax, cmap='BrBG_r',
**data_minmax(havai['topo']))
plt.colorbar(tmp, ax=ax, orientation='vertical', pad=0.01, aspect=30, shrink=1).set_label('m')
havai_bm.drawcoastlines(ax=ax)
ax.set_title('Topografia')
xp, yp = np.transpose([p1, p2])
havai_bm.plot(xp, yp, 'o-k', linewidth=2)
plt.tight_layout(pad=0)
# Rode a célula abaixo para extrair o perfil dos dados.
# In[ ]:
tmp = gridder.profile(x, y, havai['topo'], p1, p2, 100)
perfil_havai = dict(distancia=tmp[2], topo=tmp[3])
perfil_havai['bouguer'] = gridder.profile(x, y, havai['bouguer'], p1, p2, 100)[-1]
perfil_havai['disturbio'] = gridder.profile(x, y, havai['disturbio'], p1, p2, 100)[-1]
# Agora podemos fazer um gráfico com os 3 dados (topografia e anomalias) ao longo do perfil.
# In[ ]:
fig, axes = plt.subplots(2, 1, sharex=True, figsize=(14, 6))
ax1, ax2 = axes
d = perfil_havai['distancia']*0.001
ax2.fill_between([d.min(), d.max()], [0, 0], -6000, color='#2780E3')
ax2.fill_between(d, perfil_havai['topo'], -6000, color='#333333')
ax2.set_ylabel('Topografia (m)')
ax2.set_xlabel('Distancia (km)')
ax1.set_ylabel('Disturbio e Anomalia Bouguer (mGal)')
ax1.plot(d, perfil_havai['bouguer'], '-', label='Bouguer')
ax1.plot(d, perfil_havai['disturbio'], '-', label='Disturbio')
ax1.hlines(0, d.min(), d.max(), linestyles='--', color='#333333')
ax1.legend(loc='center right')
ax1.set_xlim(d.min(), d.max())
plt.tight_layout(h_pad=0, pad=0)
# ### Para pensar
#
# * As ilhas estão em equilíbrio isostático?
# * Por que o distúrbio é positivo em cima das ilhas?
# * Por que o distúrbio tem seu mínimo logo ao lado das ilhas?
# * Olhando para o perfil de topografia, por que após o baixo ao lado da ilha há um alto na topografia antes de estabilizar entre -5000 m e -6000 m?
# * Como e por que as feições do distúrbio se correlacionam com a topografia?
# * Por que a anomalia Bouguer é sempre positiva?
# * Por que a anomalia Bouguer é menos positiva sobre as ilhas?
#
# # Japão
# Vamos repetir o mesmo que fizemos antes mas para os dados do Japão:
# In[ ]:
HTML('')
# Primeiro, carregar os dados e calcular o distúrbio e anomalia Bouguer.
# In[ ]:
japao = load_icgem_gdf('../data/eigen-6c3stat-japao.gdf')
japao['topo'] = load_icgem_gdf('../data/etopo1-japao.gdf', usecols=[-1])['topography_shm']
japao['disturbio'] = japao['gravity_earth'] - normal_gravity.gamma_closed_form(japao['latitude'], japao['h_over_geoid'])
japao['bouguer'] = japao['disturbio'] - normal_gravity.bouguer_plate(japao['topo'], density_rock=2670, density_water=1040)
# Vamos ver como ficam as anomalias e a topografia para essa região.
# In[ ]:
s, n, w, e = japao['area']
japao_bm = Basemap(projection='merc', llcrnrlat=s, urcrnrlat=n, llcrnrlon=w, urcrnrlon=e,
lat_ts=0.5*(s + n), resolution='l')
# In[ ]:
x, y = japao_bm(japao['longitude'], japao['latitude'])
fig, axes = plt.subplots(1, 3, figsize=(15, 10))
ax = axes[0]
tmp = japao_bm.contourf(x, y, japao['topo'], 80, tri=True, ax=ax, cmap='BrBG_r',
**data_minmax(japao['topo']))
plt.colorbar(tmp, ax=ax, orientation='horizontal', pad=0.01, aspect=30, shrink=1).set_label('m')
japao_bm.drawcoastlines(ax=ax)
ax.set_title('Topografia')
ax = axes[1]
tmp = japao_bm.contourf(x, y, japao['disturbio'], 80, tri=True, ax=ax, cmap='RdBu_r',
**data_minmax(japao['disturbio']))
plt.colorbar(tmp, ax=ax, orientation='horizontal', pad=0.01, aspect=30, shrink=1).set_label('mGal')
japao_bm.drawcoastlines(ax=ax)
ax.set_title('Disturbio')
ax = axes[2]
tmp = japao_bm.contourf(x, y, japao['bouguer'], 80, tri=True, ax=ax, cmap='RdBu_r',
**data_minmax(japao['bouguer']))
plt.colorbar(tmp, ax=ax, orientation='horizontal', pad=0.01, aspect=30, shrink=1).set_label('mGal')
japao_bm.drawcoastlines(ax=ax)
ax.set_title('Anomalia Bouguer')
plt.tight_layout(pad=0, w_pad=0)
# Agora podemos fazer o gráfico de anomalia Bouguer por topografia equivalente.
# In[ ]:
heq = japao['topo'].copy()
heq[heq < 0] *= (2670 - 1040)/2670
plt.figure(figsize=(7, 7))
plt.title('Bouguer x Topografia - Japao')
plt.plot(heq, japao['bouguer'], '.k')
plt.xlabel('Topografia equivalente (m)')
plt.ylabel('Anomalia Bouguer (mGal)')
plt.tight_layout(pad=0)
# Vamos extrair um perfil cortando a zona de subducção, ilhas do Japão, Mar do Japão e chegando no continente.
# In[ ]:
p1, p2 = japao_bm(130, 43), japao_bm(148, 38)
plt.figure(figsize=(9, 5))
ax = plt.subplot(111)
tmp = japao_bm.contourf(x, y, japao['topo'], 80, tri=True, ax=ax, cmap='BrBG_r',
**data_minmax(japao['topo']))
plt.colorbar(tmp, ax=ax, orientation='vertical', pad=0.01, aspect=30, shrink=1).set_label('m')
japao_bm.drawcoastlines(ax=ax)
ax.set_title('Topografia')
xp, yp = np.transpose([p1, p2])
japao_bm.plot(xp, yp, 'o-k', linewidth=2)
plt.tight_layout(pad=0)
# In[ ]:
tmp = gridder.profile(x, y, japao['topo'], p1, p2, 100)
perfil_japao = dict(distancia=tmp[2], topo=tmp[3])
perfil_japao['bouguer'] = gridder.profile(x, y, japao['bouguer'], p1, p2, 100)[-1]
perfil_japao['disturbio'] = gridder.profile(x, y, japao['disturbio'], p1, p2, 100)[-1]
# In[ ]:
fig, axes = plt.subplots(2, 1, sharex=True, figsize=(14, 6))
ax1, ax2 = axes
d = perfil_japao['distancia']*0.001
ax2.fill_between([d.min(), d.max()], [0, 0], -10000, color='#2780E3')
ax2.fill_between(d, perfil_japao['topo'], -10000, color='#333333')
ax2.set_ylabel('Topografia (m)')
ax2.set_xlabel('Distancia (km)')
ax1.set_ylabel('Disturbio e Anomalia Bouguer (mGal)')
ax1.plot(d, perfil_japao['bouguer'], '-', label='Bouguer')
ax1.plot(d, perfil_japao['disturbio'], '-', label='Disturbio')
ax1.hlines(0, d.min(), d.max(), linestyles='--', color='#333333')
ax1.legend(loc='center right')
ax1.set_xlim(d.min(), d.max())
plt.tight_layout(h_pad=0, pad=0)
# ### Para pensar
#
# * Por que o distúrbio é praticamente zero na placa do Pacífico e no Mar do Japão?
# * Por que o distúrbio apresenta um par negativo-positivo quando passamos da crosta oceânica para as ilhas do Japão?
# * Qual é a relação entre o distúrbio, a topografia e a subducção?
#
# # Costa brasileira
#
# Vamos carregar os dados e fazer a análise para a margem leste brasileira (um lugar que esperamos estar em equilíbrio isostático).
# In[ ]:
HTML('')
# In[ ]:
brasil = load_icgem_gdf('../data/eigen-6c3stat-brasil.gdf')
brasil['topo'] = load_icgem_gdf('../data/etopo1-brasil.gdf', usecols=[-1])['topography_shm']
brasil['disturbio'] = brasil['gravity_earth'] - normal_gravity.gamma_closed_form(brasil['latitude'], brasil['h_over_geoid'])
brasil['bouguer'] = brasil['disturbio'] - normal_gravity.bouguer_plate(brasil['topo'], density_rock=2670, density_water=1040)
# In[ ]:
s, n, w, e = brasil['area']
brasil_bm = Basemap(projection='merc', llcrnrlat=s, urcrnrlat=n, llcrnrlon=w, urcrnrlon=e,
lat_ts=0.5*(s + n), resolution='l')
# In[ ]:
x, y = brasil_bm(brasil['longitude'], brasil['latitude'])
fig, axes = plt.subplots(1, 3, figsize=(15, 10))
ax = axes[0]
tmp = brasil_bm.contourf(x, y, brasil['topo'], 80, tri=True, ax=ax, cmap='BrBG_r',
**data_minmax(brasil['topo']))
plt.colorbar(tmp, ax=ax, orientation='horizontal', pad=0.01, aspect=30, shrink=1).set_label('m')
brasil_bm.drawcoastlines(ax=ax)
brasil_bm.drawcountries(ax=ax)
ax.set_title('Topografia')
ax = axes[1]
tmp = brasil_bm.contourf(x, y, brasil['disturbio'], 80, tri=True, ax=ax, cmap='RdBu_r',
**data_minmax(brasil['disturbio']))
plt.colorbar(tmp, ax=ax, orientation='horizontal', pad=0.01, aspect=30, shrink=1).set_label('mGal')
brasil_bm.drawcoastlines(ax=ax)
brasil_bm.drawcountries(ax=ax)
ax.set_title('Disturbio')
ax = axes[2]
tmp = brasil_bm.contourf(x, y, brasil['bouguer'], 80, tri=True, ax=ax, cmap='RdBu_r',
**data_minmax(brasil['bouguer']))
plt.colorbar(tmp, ax=ax, orientation='horizontal', pad=0.01, aspect=30, shrink=1).set_label('mGal')
brasil_bm.drawcoastlines(ax=ax)
brasil_bm.drawcountries(ax=ax)
ax.set_title('Anomalia Bouguer')
plt.tight_layout(pad=0, w_pad=0)
# In[ ]:
heq = brasil['topo'].copy()
heq[heq < 0] *= (2670 - 1040)/2670
plt.figure(figsize=(7, 7))
plt.title('Bouguer x Topografia - Brasil')
plt.plot(heq, brasil['bouguer'], '.k')
plt.xlabel('Topografia equivalente (m)')
plt.ylabel('Anomalia Bouguer (mGal)')
plt.tight_layout(pad=0)
# In[ ]:
p1, p2 = brasil_bm(360 - 58.5, -20.5), brasil_bm(360 - 33.5, -31)
plt.figure(figsize=(9, 5))
ax = plt.subplot(111)
tmp = brasil_bm.contourf(x, y, brasil['topo'], 80, tri=True, ax=ax, cmap='BrBG_r',
**data_minmax(brasil['topo']))
plt.colorbar(tmp, ax=ax, orientation='vertical', pad=0.01, aspect=30, shrink=1).set_label('m')
brasil_bm.drawcoastlines(ax=ax)
ax.set_title('Topografia')
xp, yp = np.transpose([p1, p2])
brasil_bm.plot(xp, yp, 'o-k', linewidth=2)
plt.tight_layout(pad=0)
# In[ ]:
tmp = gridder.profile(x, y, brasil['topo'], p1, p2, 200)
perfil_brasil = dict(distancia=tmp[2], topo=tmp[3])
perfil_brasil['bouguer'] = gridder.profile(x, y, brasil['bouguer'], p1, p2, 200)[-1]
perfil_brasil['disturbio'] = gridder.profile(x, y, brasil['disturbio'], p1, p2, 200)[-1]
# In[ ]:
fig, axes = plt.subplots(2, 1, sharex=True, figsize=(14, 6))
ax1, ax2 = axes
d = perfil_brasil['distancia']*0.001
ax2.fill_between([d.min(), d.max()], [0, 0], -6000, color='#2780E3')
ax2.fill_between(d, perfil_brasil['topo'], -6000, color='#333333')
ax2.set_ylabel('Topografia (m)')
ax2.set_xlabel('Distancia (km)')
ax1.set_ylabel('Disturbio e Anomalia Bouguer (mGal)')
ax1.plot(d, perfil_brasil['bouguer'], '-', label='Bouguer')
ax1.plot(d, perfil_brasil['disturbio'], '-', label='Disturbio')
ax1.hlines(0, d.min(), d.max(), linestyles='--', color='#333333')
ax1.legend(loc='center right')
ax1.set_xlim(d.min(), d.max())
plt.tight_layout(h_pad=0, pad=0)
# Vamos tentar remover o efeito da Moho isostática de nossos dados. Para fazer isso, vamos aproveitar da relação linear entre a anomalia Bouguer e a topografia equivalente. Se conseguirmos determinar a reta que melhor ajusta nossos dados, podemos utilizar essa reta como sendo o efeito gravitacional da Moho. Ao subtrairmos os dados que caem na reta dos dados obserados, estamos retirando o efeito da Moho isostática.
# In[ ]:
heq = brasil['topo'].copy()
heq[heq < 0] *= (2670 - 1040)/2670
A = np.ones((heq.size, 2))
A[:, 0] = heq
p = np.linalg.solve(A.T.dot(A), A.T.dot(brasil['bouguer']))
efeito_moho = A.dot(p)
# In[ ]:
plt.figure(figsize=(7, 7))
plt.title('Bouguer x Topografia - Brasil')
plt.plot(heq, brasil['bouguer'], '.k', label='Dados observados')
plt.plot(heq, efeito_moho, '-', label='y = {:.3f} heq + {:.3f}'.format(*p))
plt.legend(loc='upper right')
plt.xlabel('Topografia equivalente (m)')
plt.ylabel('Anomalia Bouguer (mGal)')
plt.tight_layout(pad=0)
# Agora que determinamos o efeito da Moho isostática, podemos removê-lo da nossa anomalia Bouguer.
# In[ ]:
x, y = brasil_bm(brasil['longitude'], brasil['latitude'])
fig, axes = plt.subplots(1, 3, figsize=(15, 11))
ax = axes[0]
tmp = brasil_bm.contourf(x, y, brasil['disturbio'], 80, tri=True, ax=ax, cmap='RdBu_r',
**data_minmax(brasil['disturbio']))
plt.colorbar(tmp, ax=ax, orientation='horizontal', pad=0.01, aspect=30, shrink=1).set_label('mGal')
brasil_bm.drawcoastlines(ax=ax)
brasil_bm.drawcountries(ax=ax)
ax.set_title('Disturbio')
ax = axes[1]
tmp = brasil_bm.contourf(x, y, brasil['bouguer'], 80, tri=True, ax=ax, cmap='RdBu_r',
**data_minmax(brasil['bouguer']))
plt.colorbar(tmp, ax=ax, orientation='horizontal', pad=0.01, aspect=30, shrink=1).set_label('mGal')
brasil_bm.drawcoastlines(ax=ax)
brasil_bm.drawcountries(ax=ax)
ax.set_title('Anomalia Bouguer')
ax = axes[2]
tmp = brasil_bm.contourf(x, y, brasil['bouguer'] - efeito_moho, 80, tri=True, ax=ax, cmap='RdBu_r',
vmin=-110, vmax=110)
plt.colorbar(tmp, ax=ax, orientation='horizontal', pad=0.01, aspect=30, shrink=1).set_label('mGal')
brasil_bm.drawcoastlines(ax=ax)
brasil_bm.drawcountries(ax=ax)
ax.set_title('Anomalia Bouguer - Moho')
plt.tight_layout(pad=0, w_pad=0)
# ### Para pensar
#
# * A margem brasileira está em equilíbrio isostático?
# * O que estamos presumindo quando removemos o efeito da Moho utilizando o método acima?
# * O que sobra na anomalia Bouguer após removermos o efeito da Moho isostática?
# * Qual é origem da anomalia residual negativa que vemos na porção continental?
# * Qual é origem das anomalias residuais negativas que vemos na porção oceânica?
# # Hudson Bay
# Vamos olhar como ficam as anomalias na região da Baía de Hudson, no Norte do Canadá:
# In[ ]:
HTML('')
# In[ ]:
hudson = load_icgem_gdf('../data/eigen-6c3stat-hudson.gdf')
hudson['topo'] = load_icgem_gdf('../data/etopo1-hudson.gdf', usecols=[-1])['topography_shm']
hudson['disturbio'] = hudson['gravity_earth'] - normal_gravity.gamma_closed_form(hudson['latitude'], hudson['h_over_geoid'])
hudson['bouguer'] = hudson['disturbio'] - normal_gravity.bouguer_plate(hudson['topo'], density_rock=2670, density_water=1040)
# Dessa vez, vamos usar uma [projeção polar esterográfica](http://en.wikipedia.org/wiki/Stereographic_projection) para fazer os mapas.
# A projeção Mercator distorce demais as regiões de altas latitudes.
# Nesses casos, as [projeções cônicas](http://en.wikipedia.org/wiki/Map_projection#Conic) são melhores.
# In[ ]:
s, n, w, e = hudson['area']
hudson_bm = Basemap(projection='laea', width=4000000, height=3500000,
lat_ts=0.5*(s + n), lat_0=0.5*(s + n), lon_0=0.5*(e + w), resolution='l')
# In[ ]:
x, y = hudson_bm(hudson['longitude'], hudson['latitude'])
fig, axes = plt.subplots(1, 3, figsize=(15, 12))
ax = axes[0]
tmp = hudson_bm.contourf(x, y, hudson['topo'], 80, tri=True, ax=ax, cmap='BrBG_r',
**data_minmax(hudson['topo']))
plt.colorbar(tmp, ax=ax, orientation='horizontal', pad=0.01, aspect=30, shrink=1).set_label('m')
hudson_bm.drawcoastlines(ax=ax)
ax.set_title('Topografia')
ax = axes[1]
tmp = hudson_bm.contourf(x, y, hudson['disturbio'], 80, tri=True, ax=ax, cmap='RdBu_r',
**data_minmax(hudson['disturbio']))
plt.colorbar(tmp, ax=ax, orientation='horizontal', pad=0.01, aspect=30, shrink=1).set_label('mGal')
hudson_bm.drawcoastlines(ax=ax)
ax.set_title('Disturbio')
ax = axes[2]
tmp = hudson_bm.contourf(x, y, hudson['bouguer'], 80, tri=True, ax=ax, cmap='RdBu_r',
**data_minmax(hudson['bouguer']))
plt.colorbar(tmp, ax=ax, orientation='horizontal', pad=0.01, aspect=30, shrink=1).set_label('mGal')
hudson_bm.drawcoastlines(ax=ax)
ax.set_title('Anomalia Bouguer')
plt.tight_layout(pad=0, w_pad=0)
# In[ ]:
heq = hudson['topo'].copy()
heq[heq < 0] *= (2670 - 1040)/2670
plt.figure(figsize=(7, 7))
plt.title('Bouguer x Topografia - Bahia de Hudson')
plt.plot(heq, hudson['bouguer'], '.k')
plt.xlabel('Topografia equivalente (m)')
plt.ylabel('Anomalia Bouguer (mGal)')
plt.tight_layout(pad=0)
# O perfil que vamos extrair vai do continente ao mar do Norte, cortando a baía.
# In[ ]:
p1, p2 = hudson_bm(260.5, 45.5), hudson_bm(299, 70)
plt.figure(figsize=(9, 5))
ax = plt.subplot(111)
tmp = hudson_bm.contourf(x, y, hudson['topo'], 80, tri=True, ax=ax, cmap='BrBG_r',
**data_minmax(hudson['topo']))
plt.colorbar(tmp, ax=ax, orientation='vertical', pad=0.01, aspect=30, shrink=1).set_label('m')
hudson_bm.drawcoastlines(ax=ax)
ax.set_title('Topografia')
xp, yp = np.transpose([p1, p2])
hudson_bm.plot(xp, yp, 'o-k', linewidth=2)
plt.tight_layout(pad=0)
# In[ ]:
tmp = gridder.profile(x, y, hudson['topo'], p1, p2, 200)
perfil_hudson = dict(distancia=tmp[2], topo=tmp[3])
perfil_hudson['bouguer'] = gridder.profile(x, y, hudson['bouguer'], p1, p2, 200)[-1]
perfil_hudson['disturbio'] = gridder.profile(x, y, hudson['disturbio'], p1, p2, 200)[-1]
# In[ ]:
fig, axes = plt.subplots(2, 1, sharex=True, figsize=(14, 6))
ax1, ax2 = axes
d = perfil_hudson['distancia']*0.001
ax2.fill_between([d.min(), d.max()], [0, 0], -2000, color='#2780E3')
ax2.fill_between(d, perfil_hudson['topo'], -2000, color='#333333')
ax2.set_ylabel('Topografia (m)')
ax2.set_xlabel('Distancia (km)')
ax1.set_ylabel('Disturbio e Anomalia Bouguer (mGal)')
ax1.plot(d, perfil_hudson['bouguer'], '-', label='Bouguer')
ax1.plot(d, perfil_hudson['disturbio'], '-', label='Disturbio')
ax1.hlines(0, d.min(), d.max(), linestyles='--', color='#333333')
ax1.legend(loc='center right')
ax1.set_xlim(d.min(), d.max())
plt.tight_layout(h_pad=0, pad=0)
# ### Para pensar
#
# * Esta região está em equilíbrio isostático?
# * Por que o distúrbio fica cada vez mais negativo quando mais progredimos para o Norte do perfil?
#
#