tsunami / src /tsuwave /dashboard /parameter_plots.py
Gitdeeper4's picture
رفع جميع ملفات TSU-WAVE مع YAML
12834b7
"""Parameter visualization components"""
import streamlit as st
import plotly.graph_objects as go
import plotly.express as px
import pandas as pd
import numpy as np
from typing import Dict, List, Optional
def plot_parameters(parameters: Dict[str, float], title: str = "Seven Parameters"):
"""Create parameter bar chart"""
params = list(parameters.keys())
values = list(parameters.values())
# Define colors based on thresholds
colors = []
for param, value in parameters.items():
if param.lower() == 'wcc':
colors.append('red' if value > 1.58 else 'orange' if value > 1.35 else 'green')
elif param.lower() == 'kpr':
colors.append('red' if value > 2.0 else 'orange' if value > 1.6 else 'green')
elif param.lower() == 'hfsi':
colors.append('red' if value < 0.4 else 'orange' if value < 0.6 else 'green')
elif param.lower() == 'becf':
colors.append('red' if value > 6.0 else 'orange' if value > 4.0 else 'green')
else:
colors.append('blue')
fig = go.Figure(data=[
go.Bar(name='Parameters', x=params, y=values, marker_color=colors)
])
fig.update_layout(
title=title,
xaxis_title="Parameter",
yaxis_title="Value",
height=400
)
st.plotly_chart(fig, use_container_width=True)
def plot_parameter_timeseries(parameter: str, history: pd.DataFrame):
"""Plot parameter time series"""
fig = px.line(
history,
x='timestamp',
y='value',
title=f"{parameter} Time Series"
)
# Add threshold lines
thresholds = {
'wcc': {'safe': 1.35, 'critical': 1.58},
'kpr': {'safe': 1.6, 'critical': 2.0},
'hfsi': {'safe': 0.6, 'critical': 0.4},
'becf': {'safe': 4.0, 'critical': 6.0},
'sdb': {'safe': 2.5, 'critical': 1.0},
'sbsp': {'safe': 0.7, 'critical': 1.2},
'smvi': {'safe': 0.4, 'critical': 0.6}
}
if parameter.lower() in thresholds:
t = thresholds[parameter.lower()]
fig.add_hline(y=t['safe'], line_dash="dash", line_color="orange")
fig.add_hline(y=t['critical'], line_dash="dash", line_color="red")
st.plotly_chart(fig, use_container_width=True)
def plot_parameter_comparison(param_data: Dict[str, List[float]],
zones: List[str],
parameter: str):
"""Compare parameter across zones"""
df = pd.DataFrame(param_data, index=zones)
fig = px.bar(
df.T,
title=f"{parameter} Comparison Across Zones",
barmode='group'
)
st.plotly_chart(fig, use_container_width=True)
def plot_correlation_matrix(parameters_df: pd.DataFrame):
"""Plot correlation matrix of parameters"""
corr = parameters_df.corr()
fig = px.imshow(
corr,
text_auto=True,
aspect="auto",
title="Parameter Correlation Matrix",
color_continuous_scale='RdBu_r'
)
st.plotly_chart(fig, use_container_width=True)
def plot_radar_chart(parameters: Dict[str, float],
normalized: bool = True,
title: str = "Parameter Radar Chart"):
"""Create radar chart of parameters"""
# Normalize if requested
if normalized:
norm_params = {}
for param, value in parameters.items():
if param.lower() == 'wcc':
norm_params[param] = min(value / 1.58, 1.0)
elif param.lower() == 'kpr':
norm_params[param] = min(value / 2.0, 1.0)
elif param.lower() == 'hfsi':
norm_params[param] = 1 - min(value / 1.0, 1.0) # Invert
elif param.lower() == 'becf':
norm_params[param] = min(value / 6.0, 1.0)
else:
norm_params[param] = min(value / 1.0, 1.0)
else:
norm_params = parameters
fig = go.Figure(data=go.Scatterpolar(
r=list(norm_params.values()),
theta=list(norm_params.keys()),
fill='toself'
))
fig.update_layout(
polar=dict(
radialaxis=dict(
visible=True,
range=[0, 1]
)),
showlegend=False,
title=title
)
st.plotly_chart(fig, use_container_width=True)