Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -37,48 +37,30 @@ CACHE_EXPIRY_DAYS = 1
|
|
37 |
# Color maps for Plotly (RGB)
|
38 |
color_map = {
|
39 |
'C5 Super Typhoon': 'rgb(255, 0, 0)',
|
40 |
-
'C4 Very Strong Typhoon': 'rgb(255,
|
41 |
-
'C3 Strong Typhoon': 'rgb(255,
|
42 |
-
'C2 Typhoon': 'rgb(
|
43 |
-
'C1 Typhoon': 'rgb(
|
44 |
-
'Tropical Storm': 'rgb(0,
|
45 |
-
'Tropical Depression': 'rgb(
|
46 |
}
|
47 |
|
48 |
-
# Classification standards with
|
49 |
atlantic_standard = {
|
50 |
-
'C5 Super Typhoon': {'wind_speed': 137, 'color': 'Red'},
|
51 |
-
'C4 Very Strong Typhoon': {'wind_speed': 113, 'color': 'Orange
|
52 |
-
'C3 Strong Typhoon': {'wind_speed': 96, 'color': '
|
53 |
-
'C2 Typhoon': {'wind_speed': 83, 'color': '
|
54 |
-
'C1 Typhoon': {'wind_speed': 64, 'color': '
|
55 |
-
'Tropical Storm': {'wind_speed': 34, 'color': '
|
56 |
-
'Tropical Depression': {'wind_speed': 0, 'color': '
|
57 |
}
|
58 |
|
59 |
taiwan_standard = {
|
60 |
-
'Strong Typhoon': {'wind_speed': 51.0, 'color': 'Red'},
|
61 |
-
'Medium Typhoon': {'wind_speed': 33.7, 'color': 'Orange'},
|
62 |
-
'Mild Typhoon': {'wind_speed': 17.2, 'color': 'Yellow'},
|
63 |
-
'Tropical Depression': {'wind_speed': 0, 'color': '
|
64 |
-
}
|
65 |
-
|
66 |
-
# HEX codes for Matplotlib plotting (unchanged)
|
67 |
-
atlantic_hex = {
|
68 |
-
'C5 Super Typhoon': '#FF0000',
|
69 |
-
'C4 Very Strong Typhoon': '#FF3F00',
|
70 |
-
'C3 Strong Typhoon': '#FF7F00',
|
71 |
-
'C2 Typhoon': '#FFBF00',
|
72 |
-
'C1 Typhoon': '#FFFF00',
|
73 |
-
'Tropical Storm': '#00FFFF',
|
74 |
-
'Tropical Depression': '#ADD8E6'
|
75 |
-
}
|
76 |
-
|
77 |
-
taiwan_hex = {
|
78 |
-
'Strong Typhoon': '#FF0000',
|
79 |
-
'Medium Typhoon': '#FF7F00',
|
80 |
-
'Mild Typhoon': '#FFFF00',
|
81 |
-
'Tropical Depression': '#ADD8E6'
|
82 |
}
|
83 |
|
84 |
# Data loading and preprocessing functions
|
@@ -320,31 +302,31 @@ def generate_main_analysis(start_year, start_month, end_year, end_month, enso_ph
|
|
320 |
|
321 |
return tracks_fig, wind_scatter, pressure_scatter, regression_fig, slopes_text
|
322 |
|
323 |
-
# Video animation function with
|
324 |
def categorize_typhoon_by_standard(wind_speed, standard):
|
325 |
if standard == 'taiwan':
|
326 |
wind_speed_ms = wind_speed * 0.514444
|
327 |
if wind_speed_ms >= 51.0:
|
328 |
-
return 'Strong Typhoon',
|
329 |
elif wind_speed_ms >= 33.7:
|
330 |
-
return 'Medium Typhoon',
|
331 |
elif wind_speed_ms >= 17.2:
|
332 |
-
return 'Mild Typhoon',
|
333 |
-
return 'Tropical Depression',
|
334 |
else:
|
335 |
if wind_speed >= 137:
|
336 |
-
return 'C5 Super Typhoon',
|
337 |
elif wind_speed >= 113:
|
338 |
-
return 'C4 Very Strong Typhoon',
|
339 |
elif wind_speed >= 96:
|
340 |
-
return 'C3 Strong Typhoon',
|
341 |
elif wind_speed >= 83:
|
342 |
-
return 'C2 Typhoon',
|
343 |
elif wind_speed >= 64:
|
344 |
-
return 'C1 Typhoon',
|
345 |
elif wind_speed >= 34:
|
346 |
-
return 'Tropical Storm',
|
347 |
-
return 'Tropical Depression',
|
348 |
|
349 |
def generate_track_video(year, typhoon, standard):
|
350 |
if not typhoon:
|
@@ -361,7 +343,7 @@ def generate_track_video(year, typhoon, standard):
|
|
361 |
|
362 |
# Set up the figure with adjusted size to fit Gradio (900x700 pixels at 100 DPI)
|
363 |
fig = plt.figure(figsize=(9, 7), dpi=100) # 9x7 inches = 900x700 pixels
|
364 |
-
ax = plt.axes([0.05, 0.15, 0.60, 0.80], projection=ccrs.PlateCarree()) # Map on left 60
|
365 |
ax.set_extent([min_lon - lon_padding, max_lon + lon_padding, min_lat - lat_padding, max_lat + lat_padding], crs=ccrs.PlateCarree())
|
366 |
|
367 |
# Add world map features
|
@@ -379,15 +361,17 @@ def generate_track_video(year, typhoon, standard):
|
|
379 |
date_text = ax.text(0.02, 0.02, '', transform=ax.transAxes, fontsize=10, bbox=dict(facecolor='white', alpha=0.8))
|
380 |
|
381 |
# Add sidebar with typhoon details on the right
|
382 |
-
details_title = fig.text(0.
|
383 |
-
details_text = fig.text(0.
|
384 |
bbox=dict(facecolor='white', alpha=0.8, boxstyle='round,pad=0.5'))
|
385 |
|
386 |
-
# Add color legend below the details
|
387 |
standard_dict = atlantic_standard if standard == 'atlantic' else taiwan_standard
|
388 |
-
|
389 |
-
|
390 |
-
|
|
|
|
|
391 |
|
392 |
def init():
|
393 |
line.set_data([], [])
|
@@ -468,7 +452,7 @@ with gr.Blocks(title="Typhoon Analysis Dashboard") as demo:
|
|
468 |
### Features:
|
469 |
- **Track Visualization**: View typhoon tracks by time period and ENSO phase
|
470 |
- **Statistical Analysis**: Examine relationships between ONI values and typhoon characteristics
|
471 |
-
- **Path Animation**: Watch an animated typhoon path with video controls, world map, color legend, and
|
472 |
- **Regression Analysis**: Perform statistical regression on typhoon data
|
473 |
|
474 |
Select a tab above to begin your analysis.
|
@@ -638,8 +622,8 @@ with gr.Blocks(title="Typhoon Analysis Dashboard") as demo:
|
|
638 |
4. Use the video player's built-in controls to play, pause, or scrub through the animation
|
639 |
5. The animation shows the typhoon track growing over a world map, with:
|
640 |
- Date on the bottom left
|
641 |
-
- Sidebar on the right showing typhoon details (name, date, wind speed, category)
|
642 |
-
- Color legend
|
643 |
""")
|
644 |
|
645 |
def update_typhoon_options(year):
|
|
|
37 |
# Color maps for Plotly (RGB)
|
38 |
color_map = {
|
39 |
'C5 Super Typhoon': 'rgb(255, 0, 0)',
|
40 |
+
'C4 Very Strong Typhoon': 'rgb(255, 165, 0)',
|
41 |
+
'C3 Strong Typhoon': 'rgb(255, 255, 0)',
|
42 |
+
'C2 Typhoon': 'rgb(0, 255, 0)',
|
43 |
+
'C1 Typhoon': 'rgb(0, 255, 255)',
|
44 |
+
'Tropical Storm': 'rgb(0, 0, 255)',
|
45 |
+
'Tropical Depression': 'rgb(128, 128, 128)'
|
46 |
}
|
47 |
|
48 |
+
# Classification standards with distinct colors for Matplotlib
|
49 |
atlantic_standard = {
|
50 |
+
'C5 Super Typhoon': {'wind_speed': 137, 'color': 'Red', 'hex': '#FF0000'}, # Pure Red
|
51 |
+
'C4 Very Strong Typhoon': {'wind_speed': 113, 'color': 'Orange', 'hex': '#FFA500'}, # Bright Orange
|
52 |
+
'C3 Strong Typhoon': {'wind_speed': 96, 'color': 'Yellow', 'hex': '#FFFF00'}, # Pure Yellow
|
53 |
+
'C2 Typhoon': {'wind_speed': 83, 'color': 'Green', 'hex': '#00FF00'}, # Pure Green
|
54 |
+
'C1 Typhoon': {'wind_speed': 64, 'color': 'Cyan', 'hex': '#00FFFF'}, # Pure Cyan
|
55 |
+
'Tropical Storm': {'wind_speed': 34, 'color': 'Blue', 'hex': '#0000FF'}, # Pure Blue
|
56 |
+
'Tropical Depression': {'wind_speed': 0, 'color': 'Gray', 'hex': '#808080'} # Medium Gray
|
57 |
}
|
58 |
|
59 |
taiwan_standard = {
|
60 |
+
'Strong Typhoon': {'wind_speed': 51.0, 'color': 'Red', 'hex': '#FF0000'}, # Pure Red
|
61 |
+
'Medium Typhoon': {'wind_speed': 33.7, 'color': 'Orange', 'hex': '#FFA500'}, # Bright Orange
|
62 |
+
'Mild Typhoon': {'wind_speed': 17.2, 'color': 'Yellow', 'hex': '#FFFF00'}, # Pure Yellow
|
63 |
+
'Tropical Depression': {'wind_speed': 0, 'color': 'Gray', 'hex': '#808080'} # Medium Gray
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
64 |
}
|
65 |
|
66 |
# Data loading and preprocessing functions
|
|
|
302 |
|
303 |
return tracks_fig, wind_scatter, pressure_scatter, regression_fig, slopes_text
|
304 |
|
305 |
+
# Video animation function with color examples, distinct colors, and dynamic sidebar
|
306 |
def categorize_typhoon_by_standard(wind_speed, standard):
|
307 |
if standard == 'taiwan':
|
308 |
wind_speed_ms = wind_speed * 0.514444
|
309 |
if wind_speed_ms >= 51.0:
|
310 |
+
return 'Strong Typhoon', taiwan_standard['Strong Typhoon']['hex']
|
311 |
elif wind_speed_ms >= 33.7:
|
312 |
+
return 'Medium Typhoon', taiwan_standard['Medium Typhoon']['hex']
|
313 |
elif wind_speed_ms >= 17.2:
|
314 |
+
return 'Mild Typhoon', taiwan_standard['Mild Typhoon']['hex']
|
315 |
+
return 'Tropical Depression', taiwan_standard['Tropical Depression']['hex']
|
316 |
else:
|
317 |
if wind_speed >= 137:
|
318 |
+
return 'C5 Super Typhoon', atlantic_standard['C5 Super Typhoon']['hex']
|
319 |
elif wind_speed >= 113:
|
320 |
+
return 'C4 Very Strong Typhoon', atlantic_standard['C4 Very Strong Typhoon']['hex']
|
321 |
elif wind_speed >= 96:
|
322 |
+
return 'C3 Strong Typhoon', atlantic_standard['C3 Strong Typhoon']['hex']
|
323 |
elif wind_speed >= 83:
|
324 |
+
return 'C2 Typhoon', atlantic_standard['C2 Typhoon']['hex']
|
325 |
elif wind_speed >= 64:
|
326 |
+
return 'C1 Typhoon', atlantic_standard['C1 Typhoon']['hex']
|
327 |
elif wind_speed >= 34:
|
328 |
+
return 'Tropical Storm', atlantic_standard['Tropical Storm']['hex']
|
329 |
+
return 'Tropical Depression', atlantic_standard['Tropical Depression']['hex']
|
330 |
|
331 |
def generate_track_video(year, typhoon, standard):
|
332 |
if not typhoon:
|
|
|
343 |
|
344 |
# Set up the figure with adjusted size to fit Gradio (900x700 pixels at 100 DPI)
|
345 |
fig = plt.figure(figsize=(9, 7), dpi=100) # 9x7 inches = 900x700 pixels
|
346 |
+
ax = plt.axes([0.05, 0.15, 0.60, 0.80], projection=ccrs.PlateCarree()) # Map on left 60%
|
347 |
ax.set_extent([min_lon - lon_padding, max_lon + lon_padding, min_lat - lat_padding, max_lat + lat_padding], crs=ccrs.PlateCarree())
|
348 |
|
349 |
# Add world map features
|
|
|
361 |
date_text = ax.text(0.02, 0.02, '', transform=ax.transAxes, fontsize=10, bbox=dict(facecolor='white', alpha=0.8))
|
362 |
|
363 |
# Add sidebar with typhoon details on the right
|
364 |
+
details_title = fig.text(0.65, 0.90, "Typhoon Details", fontsize=12, fontweight='bold', verticalalignment='top', horizontalalignment='left')
|
365 |
+
details_text = fig.text(0.65, 0.85, '', fontsize=10, verticalalignment='top', horizontalalignment='left',
|
366 |
bbox=dict(facecolor='white', alpha=0.8, boxstyle='round,pad=0.5'))
|
367 |
|
368 |
+
# Add color legend with colored markers below the details
|
369 |
standard_dict = atlantic_standard if standard == 'atlantic' else taiwan_standard
|
370 |
+
legend_elements = [plt.Line2D([0], [0], marker='o', color='w', label=f"{cat}",
|
371 |
+
markerfacecolor=details['hex'], markersize=10)
|
372 |
+
for cat, details in standard_dict.items()]
|
373 |
+
fig.legend(handles=legend_elements, title="Color Legend", loc='center right',
|
374 |
+
bbox_to_anchor=(0.95, 0.5), fontsize=10)
|
375 |
|
376 |
def init():
|
377 |
line.set_data([], [])
|
|
|
452 |
### Features:
|
453 |
- **Track Visualization**: View typhoon tracks by time period and ENSO phase
|
454 |
- **Statistical Analysis**: Examine relationships between ONI values and typhoon characteristics
|
455 |
+
- **Path Animation**: Watch an animated typhoon path with video controls, world map, color legend with examples, and dynamic sidebar
|
456 |
- **Regression Analysis**: Perform statistical regression on typhoon data
|
457 |
|
458 |
Select a tab above to begin your analysis.
|
|
|
622 |
4. Use the video player's built-in controls to play, pause, or scrub through the animation
|
623 |
5. The animation shows the typhoon track growing over a world map, with:
|
624 |
- Date on the bottom left
|
625 |
+
- Sidebar on the right showing typhoon details (name, date, wind speed, category) as it moves
|
626 |
+
- Color legend with colored markers (e.g., Red: C5 Super Typhoon) on the right
|
627 |
""")
|
628 |
|
629 |
def update_typhoon_options(year):
|