Browse Source

New colormap, fix orientation

master
FedorSarafanov 15 hours ago
parent
commit
d4d1b12c8a
  1. BIN
      2025-06-01.gif
  2. 60
      make_gif.py

BIN
2025-06-01.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 MiB

After

Width:  |  Height:  |  Size: 8.9 MiB

60
make_gif.py

@ -14,10 +14,37 @@ import sys @@ -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): @@ -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): @@ -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)

Loading…
Cancel
Save