mirror of
https://github.com/olehomelchenko/30DayChartChallenge2023.git
synced 2025-12-21 21:22:21 +00:00
day 2
This commit is contained in:
6927
data/share-elec-by-source.csv
Normal file
6927
data/share-elec-by-source.csv
Normal file
File diff suppressed because it is too large
Load Diff
162
pages/day2.py
Normal file
162
pages/day2.py
Normal file
@@ -0,0 +1,162 @@
|
|||||||
|
import streamlit as st
|
||||||
|
import pandas as pd
|
||||||
|
import numpy as np
|
||||||
|
import altair as alt
|
||||||
|
import math
|
||||||
|
|
||||||
|
st.set_page_config(
|
||||||
|
page_title="#30DayChartChallenge, Day 2: Waffle Chart by Oleh Omelchenko",
|
||||||
|
# page_icon=None,
|
||||||
|
layout="wide",
|
||||||
|
# initial_sidebar_state="auto",
|
||||||
|
# menu_items=None
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
df_init = pd.read_csv("data/share-elec-by-source.csv")
|
||||||
|
|
||||||
|
"""
|
||||||
|
# #30DayChartChallenge, Day 2: Waffle Chart
|
||||||
|
"""
|
||||||
|
|
||||||
|
ENTITIES, YEARS = st.columns(2)
|
||||||
|
|
||||||
|
ENTITIES = ENTITIES.multiselect(
|
||||||
|
"Entities", list(df_init.Entity.unique()), default=["Ukraine", "Europe", "World"]
|
||||||
|
)
|
||||||
|
|
||||||
|
YEARS = YEARS.multiselect(
|
||||||
|
"Years", sorted(list(df_init.Year.unique())), default=[2000, 2021]
|
||||||
|
)
|
||||||
|
|
||||||
|
df = df_init.copy()
|
||||||
|
df = (
|
||||||
|
df.query("Entity in @ENTITIES")
|
||||||
|
.query("Year in @YEARS")
|
||||||
|
.melt(id_vars=["Entity", "Year"])
|
||||||
|
)
|
||||||
|
df = df[df["variable"].str.contains("%")].reset_index(drop=True)
|
||||||
|
df['value'] = df['value'].fillna(0.)
|
||||||
|
df['value_precise'] = df['value'] / 100
|
||||||
|
df["value"] = (df["value"].apply(float) * 1).apply(round)
|
||||||
|
|
||||||
|
df_raw = df.copy()
|
||||||
|
|
||||||
|
|
||||||
|
repeat_indices = np.repeat(df.index, df["value"])
|
||||||
|
result = df.loc[repeat_indices].reset_index(drop=True)
|
||||||
|
result["cnt"] = 1
|
||||||
|
result = result.sort_values(["Entity", "Year", "value"], ascending=[True, True, True])
|
||||||
|
|
||||||
|
df = result.copy()
|
||||||
|
|
||||||
|
lists = []
|
||||||
|
for _, g in df.groupby(["Entity", "Year"]):
|
||||||
|
g = g.sort_values(["value", "variable"], ascending=False)
|
||||||
|
g["x"] = [i % 10 for i, val in enumerate(range(len(g)))]
|
||||||
|
g["y"] = [math.floor(i / 10) for i, val in enumerate(range(len(g)))]
|
||||||
|
lists.append(g)
|
||||||
|
df = pd.concat(lists)
|
||||||
|
|
||||||
|
domains = [
|
||||||
|
"Oil (% electricity)",
|
||||||
|
"Hydro (% electricity)",
|
||||||
|
"Gas (% electricity)",
|
||||||
|
"Coal (% electricity)",
|
||||||
|
"Nuclear (% electricity)",
|
||||||
|
"Bioenergy (% electricity)",
|
||||||
|
"Solar (% electricity)",
|
||||||
|
"Wind (% electricity)",
|
||||||
|
"Other renewables excluding bioenergy (% electricity)"
|
||||||
|
]
|
||||||
|
|
||||||
|
emo = ["🛢️", "🌊", "🟦", "⬛️", "☢️", "🌿", "☀️", "💨", "⚪️"]
|
||||||
|
|
||||||
|
df["emoji"] = df["variable"].map(dict(zip(domains, emo)))
|
||||||
|
with st.expander("Code for the graph"):
|
||||||
|
with st.echo():
|
||||||
|
chart = (
|
||||||
|
alt.Chart(df)
|
||||||
|
.mark_text(size=18)
|
||||||
|
.encode(
|
||||||
|
x=alt.X("y:O", title=None, axis=None),
|
||||||
|
y=alt.Y("x:O", title=None, axis=None, scale=alt.Scale(reverse=True)),
|
||||||
|
text="emoji:O",
|
||||||
|
column=alt.Column(
|
||||||
|
"Entity",
|
||||||
|
title=None,
|
||||||
|
header=alt.Header(
|
||||||
|
labelFont="Lucida Console",
|
||||||
|
labelFontSize=20,
|
||||||
|
labelColor="#074985",
|
||||||
|
),
|
||||||
|
sort=list(ENTITIES),
|
||||||
|
),
|
||||||
|
row=alt.Row(
|
||||||
|
"Year",
|
||||||
|
header=alt.Header(
|
||||||
|
labelAngle=0,
|
||||||
|
labelAlign="left",
|
||||||
|
# labelOrient='right',
|
||||||
|
labelFont="Lucida Console",
|
||||||
|
labelFontSize=20,
|
||||||
|
labelColor="#074985",
|
||||||
|
),
|
||||||
|
title=None,
|
||||||
|
),
|
||||||
|
tooltip=["Entity", "Year", "variable", alt.Tooltip("value_precise", format=".2%")],
|
||||||
|
)
|
||||||
|
.properties(
|
||||||
|
title={
|
||||||
|
"text": [
|
||||||
|
"Share of electricity production by source",
|
||||||
|
", ".join(ENTITIES),
|
||||||
|
", ".join([str(_) for _ in YEARS])
|
||||||
|
],
|
||||||
|
"subtitle": [
|
||||||
|
"Each emoji represents 1% of corresponding energy source's contribution",
|
||||||
|
"to the total electricity production in a given entity in a given year.",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"Oil 🛢️",
|
||||||
|
"Hydro 🌊",
|
||||||
|
"Gas 🟦",
|
||||||
|
"Coal ⬛️",
|
||||||
|
"Nuclear ☢️",
|
||||||
|
"Bioenergy 🌿",
|
||||||
|
"Solar ☀️",
|
||||||
|
"Wind 💨",
|
||||||
|
"Other ⚪️"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
width=200,
|
||||||
|
height=200,
|
||||||
|
)
|
||||||
|
.configure(background="#DDEEFF", padding=30)
|
||||||
|
.configure_title(
|
||||||
|
orient="top",
|
||||||
|
fontSize=20,
|
||||||
|
color="#074985",
|
||||||
|
subtitleColor="#074985",
|
||||||
|
# font='Impact',
|
||||||
|
subtitleFont="Lucida Console",
|
||||||
|
subtitlePadding=10,
|
||||||
|
dy=250,
|
||||||
|
dx=100,
|
||||||
|
anchor="end",
|
||||||
|
)
|
||||||
|
# .configure_view(strokeWidth=0)
|
||||||
|
)
|
||||||
|
|
||||||
|
st.altair_chart(chart)
|
||||||
|
|
||||||
|
|
||||||
|
with st.expander("raw data"):
|
||||||
|
df_raw
|
||||||
Reference in New Issue
Block a user