Py.Cafe

mikefinko77/

dash-carbon-emissions-analysis

Dash-Based Carbon Emissions Analysis

DocsPricing
  • Carbon_Emissions_Global_from_1850.csv
  • Carbon_Emissions_National_Totals_2021.csv
  • Carbon_Emissions_per_capita_2021.csv
  • app.py
  • requirements.txt
app.py
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
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)