Browse Source

New colormap, fix orientation

master
FedorSarafanov 2 days ago
parent
commit
d4d1b12c8a
  1. BIN
      2025-06-01.gif
  2. 54
      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

54
make_gif.py

@ -14,10 +14,37 @@ import sys
import numpy as np import numpy as np
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation, PillowWriter from matplotlib.animation import FuncAnimation, PillowWriter
from matplotlib.colors import ListedColormap, BoundaryNorm
from pathlib import Path from pathlib import Path
from msg_converter import load_npz_data 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): def create_gif(npz_path, output_path=None):
""" """
Args: Args:
@ -46,11 +73,14 @@ def create_gif(npz_path, output_path=None):
# Срезы по высоте # Срезы по высоте
doppler_5km = data['doppler'][:, :, :, 5] doppler_5km = data['doppler'][:, :, :, 5]
# Создаем цветовую схему для отражательности
reflectivity_cmap, reflectivity_norm = create_reflectivity_colormap()
# Диапазоны для colorbar # Диапазоны для colorbar
vmin_dbz = np.nanpercentile(dbz_max, 1) vmin_dbz = -10 # Фиксированный диапазон для отражательности
vmax_dbz = np.nanpercentile(dbz_max, 99) vmax_dbz = 70
vmin_dbzd = np.nanpercentile(dbzd_max, 1) vmin_dbzd = -10 # Фиксированный диапазон для отражательности
vmax_dbzd = np.nanpercentile(dbzd_max, 99) vmax_dbzd = 70
vmin_doppler = np.nanpercentile(doppler_5km, 1) vmin_doppler = np.nanpercentile(doppler_5km, 1)
vmax_doppler = np.nanpercentile(doppler_5km, 99) vmax_doppler = np.nanpercentile(doppler_5km, 99)
vmin_meteo = np.nanmin(meteo) 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) fig.suptitle('MSG Radar Data', fontsize=16, y=0.98)
# Инициализация imshow # Инициализация 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].set_title('max(dBz)')
axes[0, 0].axis('off') axes[0, 0].axis('off')
plt.colorbar(im1, ax=axes[0, 0], fraction=0.046) 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='plasma', vmin=vmin_dbzd, vmax=vmax_dbzd) 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].set_title('max(dBzD)')
axes[0, 1].axis('off') 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 = plt.cm.seismic.copy()
mod_seismic.set_bad(color='black') 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].set_title('Doppler [5 km]')
axes[1, 0].axis('off') axes[1, 0].axis('off')
plt.colorbar(im3, ax=axes[1, 0], fraction=0.046) 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].set_title('Meteo')
axes[1, 1].axis('off') axes[1, 1].axis('off')
plt.colorbar(im4, ax=axes[1, 1], fraction=0.046) plt.colorbar(im4, ax=axes[1, 1], fraction=0.046)

Loading…
Cancel
Save