Spaces:
Sleeping
Sleeping
| import dash | |
| import dash_mantine_components as dmc | |
| import plotly.express as px | |
| from dash import Input, Output, callback, dcc, html | |
| from dash_iconify import DashIconify | |
| app = dash.Dash(__name__) | |
| server = app.server | |
| df = px.data.gapminder() | |
| def create_scatter_plot(selected_year, selected_continent=None): | |
| filtered_df = df[df["year"] == selected_year] | |
| if selected_continent and selected_continent != "All": | |
| filtered_df = filtered_df[filtered_df["continent"] == selected_continent] | |
| fig = px.scatter( | |
| filtered_df, | |
| x="gdpPercap", | |
| y="lifeExp", | |
| size="pop", | |
| color="continent", | |
| hover_name="country", | |
| log_x=True, | |
| size_max=60, | |
| title=f"Life Expectancy vs GDP per Capita ({selected_year})", | |
| ) | |
| fig.update_layout( | |
| template="plotly_dark", | |
| paper_bgcolor="rgba(0,0,0,0)", | |
| plot_bgcolor="rgba(0,0,0,0)", | |
| ) | |
| return fig | |
| def create_line_chart(selected_country): | |
| country_data = df[df["country"] == selected_country] | |
| fig = px.line( | |
| country_data, | |
| x="year", | |
| y="lifeExp", | |
| title=f"{selected_country} - Life Expectancy", | |
| ) | |
| fig.update_layout( | |
| template="plotly_dark", | |
| paper_bgcolor="rgba(0,0,0,0)", | |
| plot_bgcolor="rgba(0,0,0,0)", | |
| ) | |
| return fig | |
| def create_bar_chart(selected_year): | |
| year_data = df[df["year"] == selected_year] | |
| continent_stats = year_data.groupby("continent")["lifeExp"].mean().reset_index() | |
| fig = px.bar( | |
| continent_stats, | |
| x="continent", | |
| y="lifeExp", | |
| color="continent", | |
| title=f"Average Life Expectancy by Continent ({selected_year})", | |
| ) | |
| fig.update_layout( | |
| template="plotly_dark", | |
| paper_bgcolor="rgba(0,0,0,0)", | |
| plot_bgcolor="rgba(0,0,0,0)", | |
| showlegend=False, | |
| ) | |
| return fig | |
| def create_datacard(title, value, icon, color): | |
| return dmc.Card( | |
| [ | |
| dmc.Group( | |
| [ | |
| DashIconify(icon=icon, width=30, color=color), | |
| html.Div( | |
| [ | |
| dmc.Text(value, size="xl", fw=700, c="white"), | |
| dmc.Text(title, size="sm", c="dimmed"), | |
| ] | |
| ), | |
| ], | |
| align="center", | |
| gap="md", | |
| ) | |
| ], | |
| p="md", | |
| className="datacard", | |
| ) | |
| app.layout = dmc.MantineProvider( | |
| [ | |
| html.Link( | |
| href="https://fonts.googleapis.com/css2?family=Outfit:wght@100..900&display=swap", | |
| rel="stylesheet", | |
| ), | |
| dmc.Group( | |
| [ | |
| DashIconify(icon="twemoji:globe-with-meridians", width=45), | |
| dmc.Text( | |
| "Gapminder World Data Explorer", ml=10, size="xl", fw=900, c="white" | |
| ), | |
| ], | |
| align="center", | |
| className="header", | |
| mb="md", | |
| ), | |
| dmc.Grid( | |
| [ | |
| dmc.GridCol( | |
| [ | |
| dmc.Stack( | |
| [ | |
| dmc.Card( | |
| [ | |
| dmc.Text("Controls", size="lg", mb="md"), | |
| dmc.Stack( | |
| [ | |
| html.Div( | |
| [ | |
| dmc.Text( | |
| "Year:", size="sm", mb=5 | |
| ), | |
| dmc.Slider( | |
| id="year-slider", | |
| min=1952, | |
| max=2007, | |
| step=5, | |
| value=2007, | |
| marks=[ | |
| { | |
| "value": year, | |
| "label": str(year), | |
| } | |
| for year in [ | |
| 1952, | |
| 1967, | |
| 1982, | |
| 1997, | |
| 2007, | |
| ] | |
| ], | |
| ), | |
| ] | |
| ), | |
| html.Div( | |
| [ | |
| dmc.Text( | |
| "Continent Filter:", | |
| size="sm", | |
| mb=5, | |
| ), | |
| dmc.Select( | |
| id="continent-dropdown", | |
| data=[ | |
| { | |
| "value": "All", | |
| "label": "All Continents", | |
| } | |
| ] | |
| + [ | |
| { | |
| "value": cont, | |
| "label": cont, | |
| } | |
| for cont in sorted( | |
| df[ | |
| "continent" | |
| ].unique() | |
| ) | |
| ], | |
| value="All", | |
| ), | |
| ] | |
| ), | |
| html.Div( | |
| [ | |
| dmc.Text( | |
| "Select Country:", | |
| size="sm", | |
| mb=5, | |
| ), | |
| dmc.Select( | |
| id="country-dropdown", | |
| data=[ | |
| { | |
| "value": country, | |
| "label": country, | |
| } | |
| for country in sorted( | |
| df[ | |
| "country" | |
| ].unique() | |
| ) | |
| ], | |
| value="United States", | |
| searchable=True, | |
| ), | |
| ] | |
| ), | |
| ], | |
| gap="lg", | |
| ), | |
| ], | |
| p="md", | |
| className="control-card", | |
| ) | |
| ] | |
| ) | |
| ], | |
| span=3, | |
| ), | |
| dmc.GridCol( | |
| [ | |
| dmc.Stack( | |
| [ | |
| html.Div(id="stats-cards"), | |
| dmc.Card( | |
| [dcc.Graph(id="scatter-plot")], | |
| p="sm", | |
| className="chart-card", | |
| ), | |
| ], | |
| gap="md", | |
| ) | |
| ], | |
| span=9, | |
| ), | |
| ], | |
| gutter="md", | |
| ), | |
| dmc.Grid( | |
| [ | |
| dmc.GridCol( | |
| [ | |
| dmc.Card( | |
| [dcc.Graph(id="line-chart")], p="sm", className="chart-card" | |
| ) | |
| ], | |
| span=6, | |
| ), | |
| dmc.GridCol( | |
| [ | |
| dmc.Card( | |
| [dcc.Graph(id="bar-chart")], p="sm", className="chart-card" | |
| ) | |
| ], | |
| span=6, | |
| ), | |
| ], | |
| gutter="md", | |
| mt="md", | |
| ), | |
| ], | |
| forceColorScheme="dark", | |
| theme={"colorScheme": "dark"}, | |
| ) | |
| def update_scatter_plot(selected_year, selected_continent): | |
| return create_scatter_plot(selected_year, selected_continent) | |
| def update_line_chart(selected_country): | |
| return create_line_chart(selected_country) | |
| def update_bar_chart(selected_year): | |
| return create_bar_chart(selected_year) | |
| def update_stats(selected_year): | |
| year_data = df[df["year"] == selected_year] | |
| avg_life_exp = round(year_data["lifeExp"].mean(), 1) | |
| total_pop = year_data["pop"].sum() | |
| num_countries = len(year_data) | |
| avg_gdp = round(year_data["gdpPercap"].mean(), 0) | |
| return dmc.Grid( | |
| [ | |
| dmc.GridCol( | |
| create_datacard( | |
| "Life Expectancy", | |
| f"{avg_life_exp} years", | |
| "mdi:heart-pulse", | |
| "#ff6b35", | |
| ), | |
| span=3, | |
| ), | |
| dmc.GridCol( | |
| create_datacard( | |
| "Population", | |
| f"{total_pop / 1e9:.1f}B", | |
| "mdi:account-group", | |
| "#1f77b4", | |
| ), | |
| span=3, | |
| ), | |
| dmc.GridCol( | |
| create_datacard( | |
| "Countries", str(num_countries), "mdi:earth", "#2ca02c" | |
| ), | |
| span=3, | |
| ), | |
| dmc.GridCol( | |
| create_datacard( | |
| "GDP per Capita", f"${avg_gdp:,.0f}", "mdi:currency-usd", "#d62728" | |
| ), | |
| span=3, | |
| ), | |
| ], | |
| gutter="sm", | |
| ) | |
| if __name__ == "__main__": | |
| app.run(debug=True, port=8050) | |