import dash
from dash import dcc, html, Input, Output
import pandas as pd
import plotly.express as px
# Load per capita data
df_per_capita = pd.read_csv('Carbon_Emissions_per_capita_2021.csv')
df_per_capita.rename(columns={
'Per_capita_CO2_emissions_metric_tons': 'PerCapitaEmissions'
}, inplace=True)
df_per_capita = df_per_capita.dropna(subset=['PerCapitaEmissions'])
df_per_capita = df_per_capita.sort_values('PerCapitaEmissions', ascending=False).head(10)
# Load total emissions data
df_total = pd.read_csv('Carbon_Emissions_National_Totals_2021.csv')
df_total.rename(columns={'Total': 'TotalEmissions'}, inplace=True)
df_total = df_total.dropna(subset=['TotalEmissions'])
df_total = df_total.sort_values('TotalEmissions', ascending=False).head(10)
# Reusable style header
style_header = {'textAlign': 'center', 'fontFamily': 'Arial, sans-serif'}
# Initialize app
app = dash.Dash(__name__)
app.title = "Global Carbon Emissions"
app.layout = html.Div([
html.H1("Global Carbon Emissions", style=style_header),
html.H2("Global Fossil Fuel Emissions Over Time", style=style_header),
html.Div(
dcc.Graph(
id='emissions-line-chart',
figure=px.line(
pd.read_csv('Carbon_Emissions_Global_from_1850.csv').query('Year >= 1850').melt(
id_vars='Year',
value_vars=['Solid', 'Liquid', 'Gas', 'Cement', 'Gas_Flaring'],
var_name='Category', value_name='Emissions'
),
x='Year', y='Emissions', color='Category',
title='Carbon Emissions by Category Over Time'
)
),
style={'width': '75%', 'margin': 'auto'}
),
html.H2("Top 20 CO₂ Emitters by Country (2021)", style=style_header),
html.Div([
dcc.RadioItems(
id='emissions-view-selector',
options=[
{'label': 'Per Capita Emissions', 'value': 'per_capita'},
{'label': 'Total Emissions', 'value': 'total'}
],
value='per_capita',
labelStyle={'display': 'inline-block', 'margin-right': '20px'}
)
], style={'width': '75%', 'margin': 'auto', 'textAlign': 'center', 'padding': '10px 0'}),
html.Div(
dcc.Graph(id='bubble-chart'),
style={'width': '75%', 'margin': 'auto',
'fontFamily': 'Arial, sans-serif'}
)
], style={'backgroundColor': '#a4c8e4'})
@app.callback(
Output('bubble-chart', 'figure'),
Input('emissions-view-selector', 'value')
)
def update_bubble_chart(view):
if view == 'per_capita':
fig = px.scatter(
df_per_capita,
x='Nation',
y='PerCapitaEmissions',
size='PerCapitaEmissions',
hover_name='Nation',
text='Nation',
title='Note: Total Amount (includes all categories)',
labels={'PerCapitaEmissions': 'Metric Tons CO₂ per Person'}
)
else:
fig = px.scatter(
df_total,
x='Nation',
y='TotalEmissions',
size='TotalEmissions',
hover_name='Nation',
text='Nation',
title='Note: Total Amount (includes all categories)',
labels={'TotalEmissions': 'Total Metric Tons CO₂'}
)
fig.update_layout(height=800)
fig.update_traces(
textposition='top center',
textfont=dict(color='black', size=11)
)
fig.update_traces(
textposition='top center',
textfont=dict(color='black', size=12)
)
fig.update_layout(
xaxis={'visible': False},
margin=dict(l=40, r=40, t=60, b=40)
)
return fig
if __name__ == '__main__':
app.run(debug=True)