Geo_Clima / plot_utils.py
gabriela05's picture
Create plot_utils.py
83edf0d verified
import matplotlib.pyplot as plt
import numpy as np
import geopandas as gpd
import streamlit as st
def plot_precip_com_ferrovia(da, gdf, vermelhos_gdf, nome=""):
fig, ax = plt.subplots(figsize=(10, 8))
da.plot(ax=ax, cmap="Blues", cbar_kwargs={"label": "Precipitação (mm)"})
ferrovia_buffer = gpd.read_file("/home/gabriela-vitelli/shapefiles/BUFFER_EFC_25KM_reconstruido.shp")
ferrovia_buffer.boundary.plot(ax=ax, color="lightgray", markersize=4, label="Estacas")
if not vermelhos_gdf.empty:
vermelhos_gdf.plot(ax=ax, color="red", markersize=10, label="Estacas a cada 50 km")
for _, row in vermelhos_gdf.iterrows():
if np.isclose(row["km"] % 50, 0, atol=0.1):
ax.annotate(f"{int(row['km'])}", xy=(row.geometry.x, row.geometry.y),
xytext=(3, 3), textcoords="offset points", fontsize=10, color="darkred")
ax.set_title(f"Acumulado de Precipitação ({nome})")
ax.set_xlabel("Longitude")
ax.set_ylabel("Latitude")
ax.grid(True, linestyle="--", alpha=0.4)
ax.legend()
plt.tight_layout()
st.pyplot(fig)
import os
import xarray as xr
import matplotlib.pyplot as plt
import imageio.v2 as imageio
import cartopy.crs as ccrs
import geopandas as gpd
from glob import glob
def gerar_gif_passo_a_passo(dir_grib, regiao, shp_ferrovia=None, output_dir="/tmp", output_name="gif_24h.gif"):
import os
from glob import glob
import xarray as xr
import matplotlib.pyplot as plt
import imageio.v2 as imageio
import cartopy.crs as ccrs
import geopandas as gpd
arquivos = sorted(glob(os.path.join(dir_grib, "*_tp.grib2")))
arquivos = [arq for arq in arquivos if any(f"{h:03d}_" in os.path.basename(arq) for h in range(0, 25, 3))]
if not arquivos:
raise FileNotFoundError("Nenhum arquivo GRIB2 encontrado para as primeiras 24h.")
imagens = []
ferrovia = gpd.read_file(shp_ferrovia) if regiao == "EFC" and shp_ferrovia else None
for arq in arquivos:
try:
print(f"🔍 Lendo {arq}")
ds = xr.open_dataset(arq, engine="cfgrib")
lon = np.linspace(0, 360 - 0.25, 1440)
lat = np.linspace(90, -90, 721)
ds = ds.assign_coords(longitude=("longitude", lon), latitude=("latitude", lat))
ds.coords["longitude"] = ("longitude", lon)
ds.coords["latitude"] = ("latitude", lat)
ds = ds.rename({"longitude": "lon", "latitude": "lat"})
if "tp" not in ds:
print(f"⚠️ 'tp' não encontrado em {arq}. Variáveis disponíveis: {list(ds.data_vars)}")
continue
tp = ds["tp"].squeeze()
fig, ax = plt.subplots(figsize=(8, 6), subplot_kw={'projection': ccrs.PlateCarree()})
tp.plot.pcolormesh(
ax=ax, cmap="Blues", transform=ccrs.PlateCarree(),
cbar_kwargs={"label": "Precipitação (m)"}
)
ax.coastlines()
ax.set_title(f"Step {os.path.basename(arq).split('_')[0]}")
if ferrovia is not None:
ferrovia.boundary.plot(ax=ax, edgecolor="red", linewidth=1)
nome_img = f"frame_{os.path.basename(arq).split('_')[0]}.png"
path_img = os.path.join(output_dir, nome_img)
fig.savefig(path_img, dpi=100, bbox_inches="tight")
plt.close(fig)
imagens.append(path_img)
except Exception as e:
print(f"❌ Erro ao processar {arq}: {e}")
continue
if not imagens:
raise RuntimeError("❌ Nenhuma imagem foi gerada. Verifique os arquivos GRIB.")
gif_path = os.path.join(output_dir, output_name)
with imageio.get_writer(gif_path, mode="I", duration=0.5) as writer:
for img in imagens:
writer.append_data(imageio.imread(img))
print(f"✅ GIF salvo em: {gif_path}")
return gif_path