2024-08-12 20:13:55 +00:00
import pandas as pd
import plotly . graph_objects as go
from plotly . subplots import make_subplots
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash . dependencies import Input , Output
# The code below fetches the data from the "Our World in Data" Github page.
# This is the data behind this graph/table: https://ourworldindata.org/grapher/cumulative-co-emissions
# If the url does not work you can also use the data provided, by uncommenting the line below.
2024-08-12 20:25:37 +00:00
df = pd . read_csv ( ' owid-co2-data.csv ' , header = 0 )
2024-08-12 20:13:55 +00:00
# df = pd.read_csv('https://nyc3.digitaloceanspaces.com/owid-public/data/co2/owid-co2-data.csv', header=0)
# Select only data for World
df = df [ df [ ' country ' ] == ' World ' ]
# Select year and Cumulative CO2
df = df [ [ ' year ' , ' cumulative_co2 ' ] ]
# Turn year to integer
df [ ' year ' ] = df [ ' year ' ] . astype ( int )
# Subtract from every cumulative value what has been emitted until 1750
df [ ' cumulative_co2 ' ] = df [ ' cumulative_co2 ' ] - df [ ' cumulative_co2 ' ] . iloc [ 0 ]
# For every row:
# 1. Calculate difference between "cumulative CO2 in year i" and "cumulative CO2 in last year"
# 2. Divide this difference with "cumulative CO2 in last year"
sums = [ ]
for i in range ( len ( df ) ) :
share_gen = ( df [ ' cumulative_co2 ' ] . iloc [ - 1 ] - df [ ' cumulative_co2 ' ] . iloc [ i ] ) / df [ ' cumulative_co2 ' ] . iloc [ - 1 ] * 100
sums . append ( share_gen )
# Add the new column of sums to the original DataFrame
df [ ' share_gen ' ] = sums
# Select every fifth row
df = df . iloc [ : : 5 ]
# Select data for people who were born in the last 100 years
scope = int ( 100 / 5 )
df = df . tail ( scope ) . reset_index ( drop = True )
min_year = df [ ' year ' ] . iloc [ 0 ] . item ( )
max_year = df [ ' year ' ] . iloc [ - 1 ] . item ( )
# Create a Dash application
app = dash . Dash ( __name__ )
app . layout = html . Div ( [
2024-08-15 16:20:56 +00:00
html . P ( ' 1. Works best on desktop 2. Use the slider to adjust the graph 3. Hoover mouse over graph to see (i.a.) the download button ' , style = { ' textAlign ' : ' left ' } ) ,
2024-08-12 20:13:55 +00:00
dcc . Slider (
id = ' year-slider ' ,
min = min_year ,
max = max_year ,
value = 1985 ,
marks = { str ( year ) : str ( year ) for year in range ( min_year , max_year + 1 , 5 ) } ,
step = None
) ,
dcc . Graph (
id = " sine-graph " ,
style = { ' height ' : ' 90vh ' , ' width ' : ' 100vw ' }
) ,
] )
@app.callback (
Output ( " sine-graph " , " figure " ) ,
[ Input ( " year-slider " , " value " ) ]
)
def update_graph ( year_born ) :
# Round the year born to intervals of 5
year_born_round = int ( 5 * round ( float ( year_born ) / 5 ) )
# Find index in df of year born
year_born_index = df [ df [ ' year ' ] == year_born_round ] . index . tolist ( ) [ 0 ]
# data frame to plotly graph
fig = go . Figure ( data = [
go . Bar ( y = df [ ' year ' ] , x = df [ ' share_gen ' ] , orientation = ' h ' ,
showlegend = False ,
marker_color = [ ' silver ' if i != year_born_index else ' lightcoral ' for i in range ( df . shape [ 0 ] ) ] ,
name = ' ' )
] )
2024-08-12 20:25:37 +00:00
subtitle = " See: <a href= \" https://git.pub.solar/misha/CO2-generation \" >https://git.pub.solar/misha/CO2-generation</a> (original from <a href= \" https://x.com/neilrkaye/status/1365247133507604486 \" >https://x.com/neilrkaye/status/1365247133507604486</a>) "
2024-08-12 20:13:55 +00:00
explainer = " If you were born in %s , %s %% of<br>the total amount of CO2 that has <br>been emitted since 1750, has been<br>emitted in your lifetime. " % ( int ( df [ ' year ' ] . iloc [ year_born_index ] . item ( ) ) , int ( df [ ' share_gen ' ] . iloc [ year_born_index ] . item ( ) ) )
( int ( df [ ' year ' ] . iloc [ year_born_index ] . item ( ) ) , int ( df [ ' share_gen ' ] . iloc [ year_born_index ] . item ( ) ) )
# Create subplot for vertical line
fig_vline = go . Figure ( data = [ go . Scatter ( x = [ df [ ' share_gen ' ] . iloc [ year_born_index ] ] * 2 ,
y = [ df [ ' year ' ] . min ( ) - 2.5 , df [ ' year ' ] . iloc [ year_born_index ] ] , mode = ' lines ' ,
showlegend = False ,
line = dict ( color = ' lightcoral ' ) ) ] )
# Merge figures
fig . add_trace ( fig_vline . data [ 0 ] )
2024-08-15 16:20:56 +00:00
fig . update_layout ( title_text = ' Percentage of global CO2 emissions since 1750 occurring in your lifetime (last updated: %s )<br><sub> %s </sub> ' % ( df [ ' year ' ] . iloc [ - 1 ] , subtitle ) ,
2024-08-12 20:13:55 +00:00
xaxis_title = " percentage " , yaxis_title = " year of birth " )
fig . update_yaxes ( range = [ df [ ' year ' ] . min ( ) - 2.5 , df [ ' year ' ] . max ( ) + 2.5 ] ,
tickmode = ' array ' ,
tickvals = list ( range ( df [ ' year ' ] . min ( ) , df [ ' year ' ] . max ( ) , 5 ) ) )
fig . add_annotation (
text = explainer ,
xref = " paper " , yref = " paper " ,
2024-08-15 16:20:56 +00:00
x = 0.99 , y = 0.98 , showarrow = False ,
2024-08-12 20:13:55 +00:00
align = " left " ,
font = dict ( size = 16 ) ,
bgcolor = " lightcoral " ,
borderwidth = 2
)
return fig
if __name__ == ' __main__ ' :
app . run_server ( debug = True , host = ' 0.0.0.0 ' )