135 lines
4.6 KiB
Python
135 lines
4.6 KiB
Python
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.
|
|
df = pd.read_csv('owid-co2-data.csv', header =0)
|
|
# 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([
|
|
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'}),
|
|
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 = '')
|
|
])
|
|
|
|
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>)"
|
|
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])
|
|
|
|
|
|
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),
|
|
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",
|
|
x=0.99, y=0.98, showarrow=False,
|
|
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')
|