diff --git a/2025-06-01.gif b/2025-06-01.gif index 535cfb4..7b185c9 100644 Binary files a/2025-06-01.gif and b/2025-06-01.gif differ diff --git a/make_gif.py b/make_gif.py index c62bf50..ec41189 100644 --- a/make_gif.py +++ b/make_gif.py @@ -14,10 +14,37 @@ import sys import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation, PillowWriter +from matplotlib.colors import ListedColormap, BoundaryNorm from pathlib import Path from msg_converter import load_npz_data +def create_reflectivity_colormap(): + """ + Создает цветовую схему для отражательности (dBz) + на основе предоставленных цветов и диапазонов + """ + # Цвета для отражательности + colors = [ + '#E1F2FC', '#C2E2F7', '#A8D0E9', '#CFFF99', '#54FE3A', + '#00AAFF', '#034CFF', '#0000D0', '#00007F', '#FFFE02', + '#FF7F00', '#FE3D36', '#FE0000', '#49DE00', '#00AA01', + '#F500F5', '#AA01FE', '#720000' + ] + + # Диапазоны от -10 до 70 с шагом 5 + boundaries = [-20] + list(range(-10, 75, 5)) + [80] + + # Проверяем соответствие количества цветов и границ + assert len(colors) == len(boundaries) - 1, "Количество цветов должно быть на 1 меньше количества границ!" + + # Создаем цветовую карту и нормализацию + cmap = ListedColormap(colors, name='reflectivity_segments') + norm = BoundaryNorm(boundaries, len(colors)) + + return cmap, norm + + def create_gif(npz_path, output_path=None): """ Args: @@ -46,11 +73,14 @@ def create_gif(npz_path, output_path=None): # Срезы по высоте doppler_5km = data['doppler'][:, :, :, 5] + # Создаем цветовую схему для отражательности + reflectivity_cmap, reflectivity_norm = create_reflectivity_colormap() + # Диапазоны для colorbar - vmin_dbz = np.nanpercentile(dbz_max, 1) - vmax_dbz = np.nanpercentile(dbz_max, 99) - vmin_dbzd = np.nanpercentile(dbzd_max, 1) - vmax_dbzd = np.nanpercentile(dbzd_max, 99) + vmin_dbz = -10 # Фиксированный диапазон для отражательности + vmax_dbz = 70 + vmin_dbzd = -10 # Фиксированный диапазон для отражательности + vmax_dbzd = 70 vmin_doppler = np.nanpercentile(doppler_5km, 1) vmax_doppler = np.nanpercentile(doppler_5km, 99) vmin_meteo = np.nanmin(meteo) @@ -61,25 +91,29 @@ def create_gif(npz_path, output_path=None): fig.suptitle('MSG Radar Data', fontsize=16, y=0.98) # Инициализация imshow - im1 = axes[0, 0].imshow(dbz_max[0], cmap='viridis', vmin=vmin_dbz, vmax=vmax_dbz) + im1 = axes[0, 0].imshow(dbz_max[0], cmap=reflectivity_cmap, norm=reflectivity_norm, origin='lower') axes[0, 0].set_title('max(dBz)') axes[0, 0].axis('off') - plt.colorbar(im1, ax=axes[0, 0], fraction=0.046) - - im2 = axes[0, 1].imshow(dbzd_max[0], cmap='plasma', vmin=vmin_dbzd, vmax=vmax_dbzd) + cb1 = plt.colorbar(im1, ax=axes[0, 0], fraction=0.046) + cb1.set_ticks(range(-10, 75, 5)) + cb1.ax.set_yticklabels([f'{i}' for i in range(-10, 75, 5)]) + + im2 = axes[0, 1].imshow(dbzd_max[0], cmap=reflectivity_cmap, norm=reflectivity_norm, origin='lower') axes[0, 1].set_title('max(dBzD)') axes[0, 1].axis('off') - plt.colorbar(im2, ax=axes[0, 1], fraction=0.046) + cb2 = plt.colorbar(im2, ax=axes[0, 1], fraction=0.046) + cb2.set_ticks(range(-10, 75, 5)) + cb2.ax.set_yticklabels([f'{i}' for i in range(-10, 75, 5)]) mod_seismic = plt.cm.seismic.copy() mod_seismic.set_bad(color='black') - - im3 = axes[1, 0].imshow(doppler_5km[0], cmap=mod_seismic, vmin=vmin_doppler, vmax=vmax_doppler) + + im3 = axes[1, 0].imshow(doppler_5km[0], cmap=mod_seismic, vmin=vmin_doppler, vmax=vmax_doppler, origin='lower') axes[1, 0].set_title('Doppler [5 km]') axes[1, 0].axis('off') plt.colorbar(im3, ax=axes[1, 0], fraction=0.046) - - im4 = axes[1, 1].imshow(meteo[0], cmap='YlOrRd', vmin=vmin_meteo, vmax=vmax_meteo) + + im4 = axes[1, 1].imshow(meteo[0], cmap='YlOrRd', vmin=vmin_meteo, vmax=vmax_meteo, origin='lower') axes[1, 1].set_title('Meteo') axes[1, 1].axis('off') plt.colorbar(im4, ax=axes[1, 1], fraction=0.046)