File size: 1,756 Bytes
bf07fa7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# visuals.py
import plotly.express as px
import streamlit as st
import pandas as pd

def render_summary(df: pd.DataFrame):
    st.header("Summary Statistics")
    col1, col2, col3 = st.columns(3)
    with col1:
        st.metric("Total Asteroids", len(df))
    with col2:
        hazardous_count = df['is_hazardous'].sum()
        st.metric("Potentially Hazardous", f"{hazardous_count} ({hazardous_count/len(df)*100:.1f}%)")
    with col3:
        st.metric("Avg. Size", f"{df['avg_diameter_km'].mean():.2f} km")

def render_visualizations(df: pd.DataFrame):
    st.header("Visualizations")
    viz_tab1, viz_tab2 = st.tabs(["Size Distribution", "Miss Distance"])

    with viz_tab1:
        fig1 = px.histogram(
            df, x="avg_diameter_km", color="is_hazardous",
            title="Size Distribution of Near-Earth Objects",
            labels={"avg_diameter_km": "Average Diameter (km)", "is_hazardous": "Potentially Hazardous"},
            color_discrete_map={True: "red", False: "green"}
        )
        st.plotly_chart(fig1, use_container_width=True)

    with viz_tab2:
        fig2 = px.scatter(
            df, x="miss_distance_km", y="avg_diameter_km", color="is_hazardous",
            size="relative_velocity_kph", hover_name="name",
            title="Miss Distance vs. Size (with velocity)",
            labels={
                "miss_distance_km": "Miss Distance (km)",
                "avg_diameter_km": "Average Diameter (km)",
                "is_hazardous": "Potentially Hazardous",
                "relative_velocity_kph": "Velocity (km/h)"
            },
            color_discrete_map={True: "red", False: "green"}
        )
        fig2.update_layout(xaxis_type="log")
        st.plotly_chart(fig2, use_container_width=True)