7  Capítulo – Estudos de Caso: Análise de Dados Meteorológicos

7.1 Introdução

Neste capítulo, apresentaremos estudos de caso utilizando dados climáticos e meterológico.

Cada estudo de caso abordará uma situação prática comum em análises climáticas.

7.2 Estudo de caso 01: Temperatura média mensal a partir de dados de uma estação meteorológica

As condições climatológicas influenciam desde a safra de grãos até a decisão de um vendedor ambulante levar seu carrinho para a praia ou não, sendo importante e influente na economia do país. Portanto aprender a coletar e elaborar análises de dados sobre o clima usando o Python (ou outra linguagem de programação) é fundamental para o profissional meteorologista.

Condições como a temperatura, umidade, radiação e pressão atmosgérica podem influenciar diversos aspectos do nosso cotidiano, portanto, o monitoramento do clima pode ajudar a tomar melhores decisões.

No Brasil, uma das principais fontes de dados públicas sobre condições climática é o Instituto Nacional de Meterologia (INMET), que disponibiliza dados históricos com relativa atualização sobre:

  • Precipitação

  • Pressão atmosférica

  • Radiação

  • Temperatura

  • Umidade

  • Vento

Os dados são disponibilizados para nível de:

  • Regiões

  • Estados

  • Municípios

Em uma granularidade de:

  • Data

  • Hora

Dessa forma, vamos práticar!

No primeiro estudo de caso vamos calcular e visualizar a temperatura média mensal para uma estação meteorológica do INMET.

Para isso você deve baixar dados de uma estação no site do INMET

Em seguida crie um novo notebook (código/script) no google colab (.ipynb) e comece os trabalhos.

Para o exemplo do estudo de caso será utilizado dados da estação automática A203 localizada no município de São Luís-MA para o ano de 2024.

7.3 Criando notebook/script/código

  • Acesse um navegador de internet (microsoft edge, google chrome, Opera, etc.).

  • Faça o login na sua conta gmail, então acesse Google Colab.

  • Então crie um novo notebook:

Renomei o arquivo, conecte o ambiente de trabalho e comece a construir o seu código com células de texto (explicando cada etapa) e célular de código (executando o acesso, manipulação e análise dos dados):

7.4 Instalando bibliotecas

#INSTALANDO BIBLIOTECAS

!pip install seaborn -q

7.5 Importando bibliotecas

import pandas as pd 
import matplotlib.pyplot as plt
import seaborn as sns

7.6 Carregando dados da estação (arquivo csv)

#CARREGANDO E VISUALIZANDO TABELA DE DADOS

# dados = pd.read_csv('/content/INMET_NE_MA_A203_SAO_LUIS_2024.csv', sep=';', skiprows= 8, decimal=',', encoding='latin1')

dados = "https://raw.githubusercontent.com/IzadoraSC/Disc_Computacao_II/main/Dados/INMET_NE_MA_A203_SAO%20LUIS_01-01-2024_A_31-12-2024.CSV"

dados = pd.read_csv(dados, sep = ';', skiprows = 8, decimal = ',',  encoding = 'latin1')

#visualizando as primeiras linhas da tabela
dados.head()

7.7 Manipulações iniciais dos dados

#VERIFICANDO TIPO DE DADOS EM CADA COLUNA 

print(dados.dtypes)
#VERIFICANDO NOMES DE COLUNAS
print(dados.columns)
#RENOMEANDO COLUNAS
dados = dados.rename(columns={
    'PRECIPITAÇÃO TOTAL, HORÁRIO (mm)': 'Chuva',
    'TEMPERATURA DO AR - BULBO SECO, HORARIA (°C)': 'Temperatura'})

#DELETANDO COLUNA
dados = dados.drop(columns=['Unnamed: 19'])

dados.columns
#MUDAR TIPO DE DADO DA COLUNA 'Data'

dados['Data'] = pd.to_datetime(dados['Data'], errors='coerce')

dados.dtypes
# SELECIONAR APENAS AS COLUNAS DESEJADAS

dados_2 = dados[['Data', 'Chuva', 'Temperatura']]

dados_2.head()
# CRIANDO NOVAS COLUNAS ('Mes' e 'Dia') com as funções .dt.month e .dt.day

dados_2['Mes'] = dados_2['Data'].dt.month

dados_2['Dia'] = dados_2['Data'].dt.day

dados_2.head()

7.8 Agrupar por mês e calcular média da temperatura máxima

Nesta etapa serão utilizadas as funções .groupby para agrupar os dados por mês; .mean() para gerar a média.

# AGRUPAR DADOS POR MÊS E CALCULAR MÉDIA MENSAL DA TEMPERATURA

media_mensal = dados_2.groupby("Mes")['Temperatura'].mean()

media_mensal.head()

7.9 Gerando Gráfico

Elemento Descrição
sns.lineplot() Cria o gráfico de linha
marker='o' Adiciona marcadores nos pontos
linewidth e color Controlam espessura e cor da linha
plt.xticks() Substitui os números dos meses por nomes abreviados
plt.figtext() Adiciona uma fonte abaixo do gráfico
# GRÁFICO DE TEMPERATURA MÉDIA MENSAL

plt.figure(figsize=(10, 6))
sns.lineplot(data=media_mensal, x='Mes', y='Temperatura', marker='o', linewidth=2.5, color='green')

# PERSONALIZAÇÃO

plt.title("Temperatura Média Mensal - São Luís-MA 2024", fontsize=16)
plt.xlabel("Mês", fontsize=12)
plt.ylabel("Temperatura (°C)", fontsize=12)
plt.grid(True, linestyle='--', alpha=0.5)

# AJUSTAR OS RÓTULOS DOS MESES COM AS ABREVIAÇÕES DOS NOMES DOS MESES

plt.xticks(media_mensal["Mes"], ["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"])

# FONTE DOS DADOS

plt.figtext(0.5, -0.05, "Fonte: Estação Meteorológica A203 / INMET",
            ha="center", fontsize=10, style='italic')

# EXIBIR GRÁFICO

plt.tight_layout()

# SALVAR GRÁFICO

plt.savefig("grafico_temperatura.png", dpi=300, bbox_inches='tight')

plt.show()

Resultado:

Para mais configurações sobre a geração e possibilidades de alterações no gráfico acessar a documentação das bibliotecas Matplotlib e Seaborn

7.9.1 Gráfico alternativo

# AGRUPANDO POR MÊS PARA OBTER TEMPERATURA MÍNIMA, MÉDIA  E MÁXIMA

temp_mensal = dados_2.groupby("Mes")["Temperatura"].agg(
    Tmin="min",
    Tmed="mean",
    Tmax="max"
).reset_index()

print(temp_mensal.head())
# NOMES DOS MESES

meses = ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", 
         "Jul", "Ago", "Set", "Out", "Nov", "Dez"]

# GRÁFICO DE TEMPERATURAS (MED, MIN E MAX) MENSAL

plt.figure(figsize=(10, 6))

plt.plot(meses, temperatura_mensal["Tmin"], marker='o', color='blue', label='Temp. Mínima')
plt.plot(meses, temperatura_mensal["Tmed"], marker='o', color='green', label='Temp. Média')
plt.plot(meses, temperatura_mensal["Tmax"], marker='o', color='red', label='Temp. Máxima')

# PERSONALIZAÇÃO

plt.title("Temperaturas Mensais - São Luís/MA (2024)", fontsize=14)
plt.xlabel("Mês")
plt.ylabel("Temperatura (°C)")
plt.grid(True, linestyle="--", alpha=0.5)
plt.legend()

# FONTE DOS DADOS

plt.figtext(0.5, -0.05, "Fonte: Estação Meteorológica A203 / INMET",
            ha="center", fontsize=9, style='italic')

# EXIBIR GRÁFICO

plt.tight_layout()

# SALVAR GRÁFICO

plt.savefig("grafico_temperatura_2.png", dpi=300, bbox_inches='tight')

plt.show()

8 Estudo de caso 02: Precipitação Acumulada Mensal

Para gerar o gráfico de precipitação acumulada deve-se repetir as etapas iniciais até a etapa de manipulação dos dados e geração da tabela dados_2.

8.1 Agrupar por mês

# AGRUPAR POR MÊS E SOMAR A PRECIPITAÇÃO
chuva_mensal = dados_2.groupby("Mes")["Chuva"].sum().reset_index()

chuva_mensal.head()

8.2 Gerando Gráfico

# GRÁFICO DE PRECIPITAÇÃO ACUMULADA MENSAL

plt.figure(figsize=(10, 6))
sns.barplot(data=chuva_mensal, x="Mes", y="Chuva", color="darkblue")

# PERSONALIZAÇÃO

plt.title("Precipitação Acumulada Mensal - São Luís/MA (2024)", fontsize=16)
plt.xlabel("Mês", fontsize=12)
plt.ylabel("Precipitação (mm)", fontsize=12)
plt.grid(axis="y", linestyle="--", alpha=0.5)

# AJUSTAR OS RÓTULOS DOS MESES COM AS ABREVIAÇÕES DOS NOMES DOS MESES

plt.xticks(chuva_mensal["Mes"] -1, ["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"])

# FONTE DOS DADOS

plt.figtext(0.5, -0.05, "Fonte: Estação Meteorológica A203 / INMET", 
            ha="center", fontsize=9, style='italic')

# EXIBIR GRÁFICO

plt.tight_layout()

# SALVAR GRÁFICO

plt.savefig("precipitacao_mensal.png", dpi=300, bbox_inches="tight")

plt.show()

9 Estudo de caso 03: Climograma

Neste estudo de caso vamos utilizar as tabelas dados_2 (Estudo de Caso 01) e chuva_mensal (Estudo de Caso 02) para gerar o climograma, portante, realize as etapas para geração dessas tabelas.

# GRÁFICO CLIMOGRAMA

fig, ax1 = plt.subplots(figsize=(12, 6))

# BARRAS: PRECIPITAÇÃO

sns.barplot(data=chuva_mensal, x="Mes", y="Chuva", color="darkblue")

plt.xlabel("Mês", fontsize=12)
plt.ylabel("Precipitação (mm)", fontsize=12)
plt.grid(axis="y", linestyle="--", alpha=0.5)


# LINHA: TEMPERATURA (EIXO SECUNDÁRIO)
ax2 = ax1.twinx()

sns.lineplot(data=media_mensal, x="Mes", y="Temperatura", 
             marker='o', color="red", linewidth=2.5, ax=ax2)
ax2.set_ylabel("Temperatura Média do Ar (°C)", fontsize=12)
ax2.tick_params(axis='y')

# AJUSTAR OS RÓTULOS DOS MESES COM AS ABREVIAÇÕES DOS NOMES DOS MESES

plt.xticks(chuva_mensal["Mes"] -1, ["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"])

# TÍTULO

plt.title("Climograma - São Luís/MA (2024)", fontsize=16)

# FONTE DOS DADOS

plt.figtext(0.5, -0.05, "Fonte: Estação Meteorológica A203 / INMET",
            ha="center", fontsize=10, style='italic')

# EXIBIR GRÁFICO

plt.tight_layout()

# SALVAR GRÁFICO

plt.savefig("climograma_slz_2024.png", dpi=300, bbox_inches="tight")

plt.show()

10 Estudo de caso 04: Precipitação Mensal e Anual

Neste estudo de caso, será realizada a análise da precipitação acumulada mensal e anual a partir de dados históricos de chuva registrados em uma estação pluviométrica disponíveis para download no Sistema Nacional de Informações sobre Recursos Hidrícos da ANA (Agência Nacional de Águas e Saneamento Básico).

Para isso você deve baixar dados de uma estação no site do Portal HIDROWEB:

Em seguida crie um novo notebook (código/script) no google colab (.ipynb) e comece os trabalhos.

Para o exemplo do estudo de caso será utilizado dados da estação pluviométrica 447002 localizada no município de Imperatriz-MA.

10.1 Importando bibliotecas

# CARREGANDO BIBLIOTECAS

import pandas as pd 
import matplotlib.pyplot as plt
import seaborn as sns

10.2 Carregando dados da estação (arquivo .csv)

Observação: antes de carregar (colocar no driver/colab) o arquivo .csv da estação, abra o arquivo em um bloco de notas e apague as primeiras linhas de metadados (informações), deixando apenas a partir do nome das colunas.

#CARREGANDO E VISUALIZANDO TABELA DE DADOS

dados = pd.read_csv('/content/447002_Chuvas_v2.csv', sep=';', decimal=',', encoding='latin1',
                    usecols=['Data', 'Total'])

# para rodar o exemplo pode carregar o arquivo disponível no github
# dados = "https://raw.githubusercontent.com/IzadoraSC/ebook-intro-computacao-meteorologia/refs/heads/main/dados/casos/447002_Chuvas_v2.csv"
# dados = pd.read_csv(dados, sep=';', decimal=',', encoding='latin1',
                    # usecols=['Data', 'Total'])
# VISUALIZANDO AS PRIMEIRAS LINHAS DA TABELA

dados.head()

10.3 Manipulações iniciais dos dados

# VERIFICANDO DIMENSÕES DA TABELA

dados.shape
# VERIFICANDO DADOS AUSENTES

dados.isnull().sum()
#RENOMEANDO COLUNAS

dados = dados.rename(columns={
    'Total': 'Chuva'})

dados.columns
#VERIFICANDO TIPO DE DADOS EM CADA COLUNA

print(dados.dtypes)

OBS: a data está na ordem dia/mês/ano, o padrão que a linguagem entende é ano/mês/dia (yy/mm/dd), portanto ao converter para a data para o tipo ‘datetime’ deve-se informar o parâmetro dayfirst=True

#MUDAR TIPO DE DADO DA COLUNA 'Data'

dados['Data'] = pd.to_datetime(dados['Data'], errors='coerce', dayfirst=True)

dados.dtypes
# CRIANDO NOVAS COLUNAS ('Mes' e 'Dia') com as funções .dt.month e .dt.day

dados['Mes'] = dados['Data'].dt.month

dados['Ano'] = dados['Data'].dt.year

dados.head()

10.4 Gerando Gráficos - Precipitação Mensal

# GRÁFICO DE PRECIPITAÇÃO MENSAL (1984-2025)

plt.figure(figsize=(10, 6))
sns.barplot(data=dados, x="Mes", y="Chuva", color="royalblue")

# PERSONALIZAÇÃO

plt.title("Precipitação Mensal - Imperatriz-MA (1984-2025)", fontsize=16,
          fontweight="bold")
plt.xlabel("Mês", fontsize=12)
plt.ylabel("Precipitação (mm)", fontsize=12)

plt.grid(axis="y", linestyle="--", alpha=0.6)

# FONTE DOS DADOS
plt.figtext(0.5, -0.05, "Fonte: Estação 447002 / SNIRH-ANA", ha="center", 
            fontsize=10, style='italic')



# AJUSTAR OS RÓTULOS DOS MESES COM AS ABREVIAÇÕES DOS NOMES DOS MESES

plt.xticks(ticks=range(0,12), labels=["Jan", "Fev", "Mar", "Abr", "Mai", "Jun",
                                      "Jul", "Ago", "Set", "Out", "Nov", "Dez"])

# EXIBIR GRÁFICO E SALVAR GRÁFICO

plt.tight_layout()
plt.savefig("chuva_mensal.png", dpi=300, bbox_inches="tight")

plt.show()

# SELECIONAR DADOS DE UM ÚNICO ANO

dados_2025 = dados[dados['Ano'] == 2025]
dados_2025.head(12)
# GRÁFICO DE PRECIPITAÇÃO MENSAL (2025)

plt.figure(figsize=(10, 6))
sns.barplot(data=dados_2025, x="Mes", y="Chuva", color="royalblue")

# PERSONALIZAÇÃO

plt.title("Precipitação Mensal - Imperatriz-MA (2025)", fontsize=16,
          fontweight="bold")
plt.xlabel("Mês", fontsize=12, fontweight="bold")
plt.ylabel("Precipitação (mm)", fontsize=12, fontweight="bold")

plt.ylim(0, 450)

plt.tick_params(axis='y', labelsize=12)
plt.tick_params(axis='x', labelsize=12)

plt.grid(axis="y", linestyle="--", alpha=0.6)

# FONTE DOS DADOS
plt.figtext(0.5, -0.05, "Fonte: Estação 447002 / SNIRH-ANA", ha="center", 
            fontsize=10, style='italic')



# AJUSTAR OS RÓTULOS DOS MESES COM AS ABREVIAÇÕES DOS NOMES DOS MESES

plt.xticks(ticks=range(0,5), labels=["Jan", "Fev", "Mar", "Abr", "Mai"])

# EXIBIR GRÁFICO E SALVAR GRÁFICO

plt.tight_layout()
plt.savefig("chuva_mensal_2025.png", dpi=300, bbox_inches="tight")

plt.show()

10.5 Gerando Gráficos - Precipitação Anual

# AGRUPAR PRECIPITAÇÃO POR ANO

dados_ano = dados.groupby('Ano')['Chuva'].sum().reset_index()
dados_ano.head()
# VERIFICAR ESTATÍSTICA
dados_ano.describe()
# GRÁFICO DE PRECIPITAÇÃO ANUAL (1984-2025)

plt.figure(figsize=(10, 6))
sns.barplot(data=dados_ano, x="Ano", y="Chuva", color="steelblue")

# PERSONALIZAÇÃO

plt.title("Precipitação Acumulada Anual (mm) - Imperatriz-MA (1984-2025)", fontsize=16,
          fontweight="bold")
plt.xlabel("Ano", fontsize=12, fontweight="bold")
plt.ylabel("Precipitação (mm)", fontsize=12, fontweight="bold")
plt.grid(axis="y", linestyle="--", alpha=0.6)

plt.tick_params(axis='y', labelsize=12)
plt.tick_params(axis='x', labelsize=12)
plt.xticks(rotation=90)

# FONTE DOS DADOS

plt.figtext(0.5, -0.05, "Fonte: Estação 447002 / SNIRH", ha="center",
            fontsize=10, style='italic')

# EXIBIR GRÁFICO E SALVAR GRÁFICO

plt.tight_layout()
plt.savefig("precipit_anual.png", dpi=300, bbox_inches="tight")
plt.show()

# CALCULANDO MÉDIA HISTÓRICA

media_historica_chuva = dados_ano['Chuva'].mean()
media_historica_chuva
# GRÁFICO DE PRECIPITAÇÃO ANUAL (1984-2025) COM LINHA DE MÉDIA HISTÓRICA

plt.figure(figsize=(10, 6))
sns.barplot(data=dados_ano, x="Ano", y="Chuva", color="steelblue")


# PERSONALIZAÇÃO

plt.xlabel("Ano", fontsize=12, fontweight="bold")
plt.ylabel("Precipitação Acumulada Anual (mm)", fontsize=12, fontweight="bold")
plt.grid(axis="y", linestyle="--", alpha=0.6)

plt.tick_params(axis='y', labelsize=12)
plt.tick_params(axis='x', labelsize=12)
plt.xticks(rotation=90)

# ADICIONANDO LINHA DE MÉDIA HISTÓRICA
plt.axhline(media_historica_chuva, color='red', linestyle='--',
            label=f'Média Histórica ({media_historica_chuva:.2f} mm)')
plt.legend()

# FONTE DOS DADOS

plt.figtext(0.5, -0.05, "Fonte: Estação 447002 / SNIRH", ha="center",
            fontsize=10, style='italic')

# EXIBIR GRÁFICO E SALVAR GRÁFICO

plt.tight_layout()
plt.savefig("precipit_anual_2.png", dpi=300, bbox_inches="tight")
plt.show()

11 Estudo de caso 05: Umidade Relativa (%)

Este estudo de caso será baseado em dados do repositório do Copernicus Climate Data Store (CDS), especificamente do produto: “Agrometeorological indicators from 1979 to present derived from reanalysis”.

Esse produto fornece indicadores úteis para a agricultura, como temperatura, evapotranspiração, e umidade relativa do ar, com cobertura global e dados disponíveis em resoluções mensais. Acesse o site CDS, faça o seu login e baixa o dado de umidade relativa do ar.

11.1 Usando bibliotecas “earthkit” e “cartopy”

Documentação “earthkit”: https://earthkit.ecmwf.int/

Documentação “cartopy”: https://cartopy.readthedocs.io/stable/

11.2 Instalando bibliotecas

# INSTALANDO BIBLIOTECAS

!pip install cffi -q
!pip install earthkit -q
!pip install cartopy -q

11.3 Importando bibliotecas

#CARREGANDO BIBLIOTECAS

import earthkit

import xarray as xr
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import cartopy.feature as cfeature

11.4 Carregando dado

# CARREGAR O ARQUIVO .NC (netCDF)
dado = earthkit.data.from_source(
    "file",
    "/content/Relative-Humidity-2m-12h_C3S-glob-agric_AgERA5_20230101_final-v1.1.nc")
# Conversão para estrutura xarray
xr_dado = dado.to_xarray()
xr_dado
# VISUALIZAR VARIÁVEL DISPONÍVEL

xr_dado.data_vars
# SELECIONANDO A VARIÁVEL

umid = xr_dado["Relative_Humidity_2m_12h"]

# VISUALIZAÇÃO EXPLORATÓRIA DO DADO

umid.plot()

11.5 Gerando Mapa

# GERANDO VISUALIZAÇÃO COM EARTHKIT

# Define um estilo personalizado para o gráfico
# - 'colors' define a paleta de cores (cividis invertida)
# - 'levels' define os intervalos (de 0 a 100%, de 5 em 5)

style = earthkit.plots.styles.Style(
    colors="cividis_r",
    levels=range(0, 101, 5),
)

# Cria um mapa com projeção de Robinson (ideal para visualizações globais)
chart = earthkit.plots.Map(crs=ccrs.Robinson())

# Plota os dados rapidamente usando a função 'quickplot'
# Aplica o estilo definido anteriormente
chart.quickplot(umid, style=style)

# Adiciona uma imagem de fundo padrão (ex. oceano e continente sombreado)
chart.stock_img()

# Adiciona contornos dos continentes e das linhas costeiras
# Usa resolução média para melhor qualidade
chart.coastlines(resolution="medium")

# Insere linhas de grade (latitude e longitude)
chart.gridlines()

# Define o título do gráfico automaticamente com nome longo e data formatada
chart.title("Umidade Relativa do Ar (%) {time:%Y-%m-%d}")

# Adiciona legenda com rótulo
chart.legend(label="Umidade Relativa do Ar (%)")


# Exibe o gráfico na tela
chart.show()

11.6 Outra forma de carregar o arquivo

# CARREGAR O ARQUIVO .NC (netCDF)

ds = xr.open_dataset("/content/Relative-Humidity-2m-12h_C3S-glob-agric_AgERA5_20230101_final-v1.1.nc")

ds
# Ver variáveis no arquivo
print(ds.data_vars)
    
# Ver coordenadas (lat, lon, time)
print(ds.coords)
# SELECIONANDO A VARIÁVEL

umidade = ds["Relative_Humidity_2m_12h"]
# GERANDO VISUALIZAÇÃO COM CARTOPY

# CRIAR FIGURA E EIXO COM PROJEÇÃO GEOGRÁFICA
fig = plt.figure(figsize=(12, 6))
ax = plt.axes(projection=ccrs.PlateCarree())  # Pode usar outras projeções, Ex.: Robinson, Mercator

# PLOTAR DADO
plot = umidade.plot(
    ax=ax,
    transform=ccrs.PlateCarree(),  # Sistema de coordenadas dos dados
    cmap="cividis_r",
    levels=21,
    cbar_kwargs={'label': 'Umidade Relativa do Ar (%)'}
)

# ADICIONAR ELEMENTOS AO MAPA
ax.coastlines(resolution='110m')
ax.add_feature(cfeature.BORDERS, linestyle=':')
ax.add_feature(cfeature.LAND, facecolor='lightgray', alpha=0.5)
ax.gridlines(draw_labels=True)

# ADICIONAR TÍTULO
plt.title("Umidade Relativa do Ar (%) - 01/01/2023",
          fontsize=14)
          
# SALVAR FIGURA DO MAPA COMO ARQUIVO .PNG
plt.savefig("mapa_umidade.png", dpi=300)

# EXIBIR O MAPA
plt.show()

# GERANDO MAPA APENAS NA REGIÃO DO BRASIL

# Aqui, é selecionado a faixa de latitude entre 5°N e 35°S e longitude entre 85°W e 25°W, 
# que delimita aproximadamente a região que compreende o Brasil.
umid_br = umidade.sel(lat=slice(5, -35), lon=slice(-85, -25)) 


# CRIAR A FIGURA E OS EIXOS COM PROJEÇÃO GEOGRÁFICA
fig = plt.figure(figsize=(10, 6))
ax = plt.axes(projection=ccrs.PlateCarree())

# PLOTAR OS DADOS DE UMIDADE PARA O BRASIL
umid_br.plot(
    ax=ax,
    transform=ccrs.PlateCarree(),
    cmap="cividis_r",
    levels=21,
    cbar_kwargs={'label': 'Umidade Relativa do Ar (%)'}
)

# ADICIONAR DETALHES GEOGRÁFICOS
ax.coastlines()
ax.add_feature(cfeature.BORDERS, linestyle=':')
ax.gridlines(draw_labels=True)

# SALVAR FIGURA DO MAPA COMO ARQUIVO .PNG
plt.savefig("mapa_umidade_br.png", dpi=300)

# ADICIONAR TÍTULO
plt.title("Umidade Relativa do Ar (%) - Brasil")

# EXIBIR O MAPA
plt.show()