anthroposouth/anthroposouth_visuals_version_2.ipynb

552 lines
322 KiB
Text
Raw Normal View History

2025-10-28 08:01:20 +01:00
{
"cells": [
{
"cell_type": "code",
2025-10-28 10:10:59 +01:00
"execution_count": 40,
2025-10-28 08:01:20 +01:00
"id": "c09834e2-1f4d-4b97-b5bb-50f8940bfcab",
"metadata": {},
"outputs": [],
"source": [
"import sys\n",
"import csv\n",
"import matplotlib\n",
"import numpy as np\n",
"import pandas as pd\n",
"import seaborn as sns\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"id": "67f7914b-a7a7-4d96-b92f-9cb6c788f063",
"metadata": {},
"source": [
"# 1 - Oil production\n",
"\n",
"Relative oil production per country between 1900 and 2023"
]
},
{
"cell_type": "code",
2025-10-28 10:10:59 +01:00
"execution_count": 41,
2025-10-28 08:01:20 +01:00
"id": "6f8dcf94-577f-4b44-a658-1e9fd07469d4",
"metadata": {},
"outputs": [],
"source": [
"# load data, set index, and workout total production in given unit\n",
"oil = pd.read_csv(\"version_2/input/oilproductionrelative_v2.csv\")\n",
"oil.set_index(\"Year\", inplace=True)\n",
"oil['Total'] = oil.sum(axis=1)"
]
},
{
"cell_type": "code",
2025-10-28 10:10:59 +01:00
"execution_count": 42,
2025-10-28 08:01:20 +01:00
"id": "19d81163-1d42-407b-bf34-2fe194593285",
"metadata": {},
"outputs": [],
"source": [
"# relative percentage of production into \"country_percent\" columns\n",
"for column in oil:\n",
" oil[column + \"_percent\"] = oil[column] / oil.Total"
]
},
{
"cell_type": "code",
2025-10-28 10:10:59 +01:00
"execution_count": 43,
2025-10-28 08:01:20 +01:00
"id": "49ba427d-7d99-4b11-a121-1bfe1c9aec42",
"metadata": {},
2025-10-28 10:10:59 +01:00
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1700x800 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
2025-10-28 08:01:20 +01:00
"source": [
"# grey palette for black and white printing\n",
"sns.set_palette(\"Greys\")\n",
"\n",
"# decent size and light grey background\n",
"fig, ax = plt.subplots(figsize = (17,8))\n",
"ax.set_facecolor('#fdfdfd')\n",
"\n",
"# actual plot\n",
"ax.stackplot(\n",
" oil.index,\n",
" oil.Argentina_percent,\n",
" oil.Brazil_percent,\n",
" oil.Colombia_percent,\n",
" oil.Ecuador_percent,\n",
" oil.Mexico_percent,\n",
" oil.Venezuela_percent,\n",
" oil.Others_percent\n",
")\n",
"\n",
2025-10-28 10:10:59 +01:00
"# minimalistic x axis without precise ticks\n",
2025-10-28 08:01:20 +01:00
"plt.xticks(np.arange(1900, 2023, 10))\n",
"ax.get_yaxis().set_ticks([])\n",
"ax.tick_params(length=4, color=\"white\")\n",
"plt.xticks(ha='left')\n",
"\n",
"# no border, clean layout, no non-sense\n",
"ax.spines['top'].set_visible(False)\n",
"ax.spines['right'].set_visible(False)\n",
"ax.spines['bottom'].set_visible(False)\n",
"ax.spines['left'].set_visible(False)\n",
"ax.set_ymargin(0.005)\n",
"ax.set_xmargin(0)\n",
"\n",
"# legend placement is manual (and tricky)\n",
"labels_legend = [\n",
" 'Argentina',\n",
" 'Brazil',\n",
" 'Colombia',\n",
" 'Ecuador',\n",
" 'Mexico',\n",
" 'Venezuela',\n",
" 'Others']\n",
"ax.legend(labels=labels_legend, loc='right', bbox_to_anchor=(0.558, 0.5, 0.545, 0.77), edgecolor=\"white\", reverse=True)\n",
"\n",
"# output to file\n",
"plt.savefig(\"version_2/output/1_oil.png\")"
]
},
{
"cell_type": "markdown",
"id": "6d1ead40-e7ae-4dc3-826e-3c437108080d",
"metadata": {},
"source": [
"# 2 - Selected\n",
"\n",
"Subset of 3 countries with raw amounts\n",
"\n",
"__Important__: match the colors to other graphics"
]
},
{
"cell_type": "code",
2025-10-28 10:10:59 +01:00
"execution_count": 44,
2025-10-28 08:01:20 +01:00
"id": "afdca3f2-4605-4147-a0bb-f7a67af65341",
"metadata": {},
"outputs": [],
"source": [
"# load data, set index\n",
"selected = pd.read_csv(\"version_2/input/1-laselected.csv\")\n",
2025-10-28 08:01:20 +01:00
"selected.set_index(\"Year\", inplace=True)"
]
},
{
"cell_type": "code",
2025-10-28 10:10:59 +01:00
"execution_count": 45,
2025-10-28 08:01:20 +01:00
"id": "f051778e-eed5-4288-8027-e62b1c68598d",
"metadata": {},
2025-10-28 10:10:59 +01:00
"outputs": [
{
"data": {
"image/png": "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BQAAAAAAQI1t375do0aN0o033qjFixfX+Tl/drtd7777rovSAXC1Bg0a6Oabb9aTTz6pjIwM3XXXXZKkcePGae3atRo5cqS2bt2qvXv3at68eSc8/PV0brvtNp111lm67rrrtGrVKh04cEDJycl6+OGHdeTIEWVmZurvf/+7brnlFiUkJCgzM1OZmZk6duyYJKl3796KjIzUU089pf3792v69OlKTEysco9nn31Wn3/+ucaPH6+dO3dq165dmjFjhp5++umTZurQoYPS0tI0Y8YM7d+/X++++67mzJlTq1+7k2HHPAAAAAAAAKpt48aN+vjjj7Vu3TqXr/3DDz9o27ZtOv/8812+NuDNavowVlPuueceffrpp7rqqqvUvHlzSb/Pjl+xYoX+/e9/q3///nI6nWrXrp1uvvnmaq8bGRmplStXaty4cRo6dKgKCwt19tlna/DgwYqOjtbmzZuVlZWlKVOmaMqUKZXXtWrVSgcPHlSjRo00bdo0jR07Vp988okGDx6s5557Tvfff3/luQkJCVqwYIGef/55/fe//1VoaKg6d+6se++996SZrr32Wo0ZM0YjR45UWVmZhgwZomeeeUbPPfdc7X7x/sTi/PPwHT9T13drAQAAAAAA8Htx+Prrr2vLli1uvU+PHj1O2OkK+JqgIAaV4PT4DgEAAAAAAMAZvfPOO24v5SVp8+bNSk5Odvt9AMAkinkAAAAAAACcVm5urjZt2uSx+73zzjuqqKjw2P0AwNMo5gEAAAAAAHBay5cvl91u99j99u/fr7lz53rsfgDgaRTzAAAAAAAAOK0lS5Z4/J4fffSRSktLPX5fAPAEinkAAAAAAACcUkFBgX788UeP3/fo0aOaNm2ax+8LAJ5AMQ8AAAAAAIBT8vQYmz+aPHmycnNzjdwbANyJYh4AAAAAAACnZGKMzXFFRUWaOHGisfsDgLtQzAMAAAAAAOCkiouLtW7dOqMZZs2apSNHjhjNAACuRjEPAAAAAACAk0pOTlZ5ebnRDDabTe+++67RDAA8Jzk5WRaLRXl5eaajuBXFPAAAAAAAAE7qhx9+MB1BkrR48WLt3LnTdAwgYN11112yWCx68MEHTzg2YsQIWSwW3XXXXS65V79+/ZSRkaGYmBiXrOetLE6n02k6hDs5HA7TEQAAAAAAAHxOSUmJBg4cKKvVajqKJOnCCy9UYmKiLBaL6SjAGQUF1Ww/9O233+6mJCc3derUGp1/1113admyZSooKFBGRoYiIiIkSVarVc2aNVN0dLQGDRqkxMREN6T1TzX6DnnuuedksViq/OjcuXPlcavVqhEjRiguLk4NGjTQsGHDlJWVVWWNtLQ0DRkyRJGRkWrSpInGjh17wpO9k5OT1aNHD9WrV0/t27fnPygAAAAAAICHrV692mtKeUnasmWLpk2bZjoGELB69Oihc845R998803la998841atmypCy+8sPI1h8OhV155RW3atFFERITOP/98zZ49W5LkdDp12WWXKSEhQcf3i+fk5KhFixZ69tlnJZ18lM2aNWs0cOBARUZGqmHDhkpISFBubq4kqaysTA8//LCaNGmi8PBw/eUvf9GGDRvc/ctRZzUeZXPuuecqIyOj8sfq1asrj40ZM0bz58/XrFmztGLFCqWnp2vo0KGVxysqKjRkyBC
"text/plain": [
"<Figure size 1700x800 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
2025-10-28 08:01:20 +01:00
"source": [
"# custom palette to match country colors to first plot\n",
"palette_selected = [\"#d1d1d1\", \"#5c5c5c\", \"#2b2b2b\"]\n",
"sns.set_palette(sns.color_palette(palette_selected))\n",
"\n",
"# all plots with same lightest grey background\n",
"fig, ax = plt.subplots(figsize = (17,8))\n",
"ax.set_facecolor('#fdfdfd')\n",
"\n",
"# actual plot\n",
"ax.stackplot(\n",
" selected.index,\n",
" selected.Brazil,\n",
" selected.Mexico,\n",
" selected.Venezuela\n",
")\n",
"\n",
2025-10-28 09:59:59 +01:00
"# Raw numbers need a Y axis scale and lines\n",
"plt.xticks(np.arange(1900, 2021, 10))\n",
"plt.yticks(np.arange(1000, 6000, 1000))\n",
2025-10-28 08:01:20 +01:00
"ax.tick_params(length=4, color=\"white\")\n",
"plt.xticks(ha='left')\n",
2025-10-28 09:59:59 +01:00
"ax.grid(axis=\"y\")\n",
2025-10-28 08:01:20 +01:00
"\n",
"# no border, clean layout, no non-sense\n",
"ax.spines['top'].set_visible(False)\n",
"ax.spines['right'].set_visible(False)\n",
"ax.spines['bottom'].set_visible(False)\n",
"ax.spines['left'].set_visible(False)\n",
"ax.set_ymargin(0.005)\n",
"ax.set_xmargin(0)\n",
"\n",
"# legend placement is manual (and tricky)\n",
"labels_legend = [\n",
" 'Brazil',\n",
" 'Mexico',\n",
" 'Venezuela',\n",
"]\n",
"ax.legend(labels=labels_legend, loc='right', bbox_to_anchor=(0.558, 0.5, 0.544, 0.91), edgecolor=\"white\", reverse=True)\n",
"\n",
"# output to file\n",
"plt.savefig(\"version_2/output/2_selected.png\")"
]
},
{
"cell_type": "markdown",
"id": "d950448c-503b-4c77-a48a-a4ffcb686d14",
"metadata": {},
"source": [
"# 3 - Raffinage\n",
"Raw data of oil refinment by country of shorter period of time (1940-2023)"
]
},
{
"cell_type": "code",
2025-10-28 10:10:59 +01:00
"execution_count": 46,
2025-10-28 08:01:20 +01:00
"id": "863148f6-5ad4-456a-81ac-ccbbc347a9da",
"metadata": {},
"outputs": [],
"source": [
"# load data, set index\n",
"raffinage = pd.read_csv(\"version_2/input/2-refining.csv\")\n",
"raffinage.set_index(\"Year\", inplace=True)"
]
},
{
"cell_type": "code",
2025-10-28 10:10:59 +01:00
"execution_count": 47,
2025-10-28 08:01:20 +01:00
"id": "44fd6c05-2fd9-4a71-8ff3-28e35eb2a4fb",
"metadata": {},
2025-10-28 10:10:59 +01:00
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABecAAAKXCAYAAAAIHvGKAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAA7h9JREFUeJzs3Xd4VGXC/vF7SiaZlElISCOQUAKBIAiIFEXBVzTsoitrWXVd0Z+suyCogAXbIiIiq2BhFXWVJoqoq6ILC8iiqCDSlF4UaVICmF6n//7wzbxGQBIyyUn5fq5rLiZzznnOPSGE5J5nnmPy+/1+AQAAAAAAAACAOmM2OgAAAAAAAAAAAE0N5TwAAAAAAAAAAHWMch4AAAAAAAAAgDpGOQ8AAAAAAAAAQB2jnAcAAAAAAAAAoI5RzgMAAAAAAAAAUMco5wEAAAAAAAAAqGOU8wAAAAAAAAAA1DHKeQAAAAAAAAAA6hjlPAAAAAAAAAAAdYxyHgAAAAAAAACAOkY5DwAAAAAAAABAHbMaHaC2+Xw+oyMAAAAAAAAAaELMZuZE48z4KgEAAAAAAAAAoI41+pnzAAAAAAAAAFAVP/74o/bt26cTJ07I7/ef9ThXXnllEFOhsTL5a/JV1gCwrA0AAAAAAACACm63WwcPHtS+ffu0f/9+7du3T/v27dOBAwdUVFQUlHNs27at2secc845QTl3VZ1NxqbAZDLpgw8+0JAhQ2r9XMycBwAAAAAAANDo5OXlBYr3ihJ+//79Onz4sLxer9HxGpQrr7xSbrdbS5cuPWnbF198oYsvvlibN29W165dDUjXcFHOAwAAAAAAAKjX/H6/CgsLlZeXp4KCgsCf+fn5p7z9+OOPKigoMDp2ozFs2DBdc801OnTokFq2bFlp2+zZs9WzZ0+K+bNAOQ8AAAAAAAAgqEpLS1VYWKiysjI5nU6Vl5ervLxcZWVlgftOp7PSxz+/lZWVVSrhCwsLme1uoCuuuELx8fGaM2eOHnnkkcDjxcXFevfdd/X0009r1apVevDBB7VhwwY1b95cv//97/Xkk08qIiJCktS6dWv95S9/0Z49e/Tuu++qWbNmeuSRR/SXv/wlMN4PP/yge+65Rx9//LHMZrMuuugiPf/882rdurWkn5ac+aW0tDTt379fc+bM0ejRo5Wfnx/YtnDhQv3+97+vdP2ADz/8UI899ph27NihFi1a6JZbbtHDDz8sq/XUVfm4ceP0wQcf6NChQ0pKStJNN92k8ePHKyQkpCafUkmU8wAAAAAAAABqyOl06ptvvtFXX32lr776Srt27eJakI2I1WrV0KFDNWfOHD388MOBkvzdd9+V1+tV3759deGFF2rSpEmaNWuWTpw4oVGjRmnUqFGaPXt2YJxp06bp8ccf10MPPaR//etfGjFihPr376+MjAy53W5lZWWpb9+++uKLL2S1WjVp0iQNGjRIW7Zskc1m09GjRwNjlZSUaNCgQerbt2+Vn8cXX3yhoUOHavr06brooov0/fffB14cePTRR095TFRUlObMmaMWLVpo69atuv322xUVFaX777//bD6VlXBBWAAAAAAAAADV4vP5tGvXrkAZv2nTJpWXlxsdq95ojBeE3bVrlzp16qRPP/1UAwYMkCRdfPHFSktLU2hoqCwWi1555ZXA/qtWrVL//v1VUlKisLAwtW7dWhdddJHmzZsn6aelipKSkvTYY49p+PDheuONNzRp0iTt3LkzUP67XC7FxMRo4cKFuvzyywNj+/1+XXPNNTp48KC++OIL2e32Ks2cHzhwoC699FI9+OCDgX3eeOMN3X///Tpy5IikM18QdurUqVqwYIE2bNhQrc/fqTBzHgAAAAAAAMAZHTp0KFDGr1u3rlIJisavY8eOuuCCCzRr1iwNGDBAe/bs0RdffKGJEyfqvvvu05YtW/Tmm28G9vf7/fL5fNq3b586deokSZXWpTeZTEpKStLx48clSZs3b9aePXsUFRVV6bzl5eX6/vvvKz320EMPac2aNdqwYYPsdnuVn8PmzZu1evVqPfHEE4HHvF6vysvLVVpaqvDw8JOOefvttzV9+nR9//33Ki4ulsfjkcPhqPI5fw3lPAAAAAAAAICTFBQUaO3atYFC/tChQ0ZHgsGGDRumO++8Uy+++KJmz56tdu3aqX///iouLtZf//pX3XXXXScdk5qaGrj/y3XaTSZTYOWT4uJinXfeeZUK/grx8fGB+2+88YaeffZZrVy5UikpKYHHzWazfrlIjNvtrvRxcXGxHnvsMV199dUnnSMsLOykx9asWaObbrpJjz32mLKyshQdHa0FCxZo2rRpJ+17NijnAQAAAAAAAMjpdOrrr7/WV199pbVr17JuPE7yhz/8QXfffbfmz5+v119/XSNGjJDJZFKPHj20Y8cOpaenn/XYPXr00Ntvv62EhITTzkxfs2aN/vznP+uVV15Rnz59Km2Lj49XUVGRSkpKAheh3bRp00nn2L17d5Vzfvnll0pLS9PDDz8ceOzAgQPVeFa/jnIeAAAAAAAAaIJ8Pp927NgRmBm/efNmOZ1Oo2OhHouMjNT111+vBx98UIWFhbr11lslSePGjVOfPn00atQo/fnPf1ZERIR27Nih5cuX64UXXqjS2DfddJOefvppXXXVVZo4caJatmypAwcO6P3339f9998vq9Wq3//+97rhhhuUlZWl7OxsSZLFYlF8fLx69+6t8PBwPfTQQ7rrrru0du1azZkzp9I5xo8fryuuuEKpqam69tprZTabtXnzZm3btk2TJk06KVP79u118OBBLViwQOeff74WL16sDz74oEafw5+jnAcAAAAAAACaiAMHDgTK+PXr16uwsNDoSPhfZ3MRWSMMGzZMM2fO1G9/+1u1aNFC0k9ryX/22Wd6+OGHddFFF8nv96tdu3a6/vrrqzxueHi4Pv/8c40bN05XX321ioqKlJKSoksvvVQOh0Nff/21jh07prlz52ru3LmB49LS0rR//37FxsbqjTfe0H333adXX31Vl156qSZMmKC//OUvgX2zsrK0aNEiTZw4UX//+98VEhKijh076s9//vMpM/3ud7/TmDFjNGrUKDmdTg0ePFh/+9vfNGHChLP75P2Cyf/LhXgaGd56AwAAAAAAgKYqJydHa9euDdyOHDlidKQmoaEU7TAWM+cBAAAAAACABsbj8aigoEAFBQXKz88P/FlxPy8vT9u3b9d333130kUyAdQPlPMAAAAAAABAPbNr1y599tlnpyze8/PzVVxcTOkONHCU8wAAAAAAAEA9UVZWphkzZujNN9+Ux+MxOg6AWkQ5DwAAAAAAANQDa9as0eOPP65Dhw4ZHQVAHaCcBwAAAAAAAAyUl5enp59+WosWLTI6CoA6RDkPAAAAAAAAGOTf//63pk6dqry8PKOjAKhjlPMAAAAAAABAHTt06JAmTZqkL7/80ugoAAxCOQ8AAAAAAADUEa/Xq9dff10vvfSSysvLjY4DwECU8wAAAAAAAEAd2LFjhyZMmKBdu3YZHQVAPUA5DwAAAAAAANSi0tJSzZgxQ2+++aa8Xq/RcVBP3XzzzXV6vnnz5tXp+apj5cqVuuSSS5SXl6eYmBij49Qas9EBAAAAAAAAgMZq9erVuvrqq/X6669TzKNBu/XWW2UymTR8+PCTto0cOVImk0m33nprUM51wQUX6OjRo4qOjg7KePUV5TwAAAAAAAAQZPn5+XrwwQc1YsQIHTlyxOg4QFC0atVKCxYsUFlZWeCx8vJyzZ8/X6mpqUE7j81mU1JSkkwmU9DGrI8o5wEAAAAAAIAgWrVqla655hotXrzY6ChAUPXo0UOtWrXS+++/H3js/fffV2pqqrp37x54zOfz6cknn1SbNm1kt9t17rnn6l//+pckye/3a+DAgcrKypLf75ck5ebmqmXLlho/frykn5a1MZlMys/PD4y5evVqDRgwQOHh4WrWrJmysrKUl5cnSXI6nbrrrruUkJCgsLAw9evXT+vXr6/tT0eNUc4DAAAAAAAAQVBWVqbHH39cd9xxh06cOGF0HKBW3HbbbZo9e3b
"text/plain": [
"<Figure size 1700x800 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
2025-10-28 08:01:20 +01:00
"source": [
"# Same palette as first (oil) plot but Ecuador is now Peru\n",
"sns.set_palette(\"Greys\")\n",
"\n",
"# same size and background color\n",
"fig, ax = plt.subplots(figsize = (17,8))\n",
"ax.set_facecolor('#fdfdfd')\n",
"\n",
"# actual plot\n",
"ax.stackplot(\n",
" raffinage.index,\n",
" raffinage.Argentina,\n",
" raffinage.Brazil,\n",
" raffinage.Colombia,\n",
" raffinage.Peru,\n",
" raffinage.Mexico,\n",
" raffinage.Venezuela\n",
")\n",
"\n",
2025-10-28 09:59:59 +01:00
"# Raw numbers need a Y axis scale and lines\n",
2025-10-28 08:01:20 +01:00
"plt.xticks(np.arange(1940, 2023, 10))\n",
2025-10-28 09:59:59 +01:00
"plt.yticks(np.arange(1000, 7000, 1000))\n",
2025-10-28 08:01:20 +01:00
"ax.tick_params(length=4, color=\"white\")\n",
"plt.xticks(ha='left')\n",
2025-10-28 09:59:59 +01:00
"ax.grid(axis=\"y\")\n",
2025-10-28 08:01:20 +01:00
"\n",
"# same minimalist look\n",
"ax.spines['top'].set_visible(False)\n",
"ax.spines['right'].set_visible(False)\n",
"ax.spines['bottom'].set_visible(False)\n",
"ax.spines['left'].set_visible(False)\n",
"ax.set_ymargin(0.005)\n",
"ax.set_xmargin(0)\n",
"\n",
"# legend\n",
"labels_legend = [\n",
" 'Argentina',\n",
" 'Brazil',\n",
" 'Colombia',\n",
" 'Peru',\n",
" 'Mexico',\n",
" 'Venezuela',\n",
"]\n",
"ax.legend(labels=labels_legend, loc='right', bbox_to_anchor=(0.558, 0.5, 0.545, 0.80), edgecolor=\"white\", reverse=True)\n",
"\n",
"# output to file\n",
"plt.savefig(\"version_2/output/3_raffinage.png\")"
]
},
{
"cell_type": "markdown",
"id": "0d8dd45e-5b6d-4e1d-a283-10e05265b599",
"metadata": {},
"source": [
"# 4 - Energy mix\n",
"General proportion of energy production source from 1800 to 2000"
]
},
{
"cell_type": "code",
2025-10-28 10:10:59 +01:00
"execution_count": 48,
2025-10-28 08:01:20 +01:00
"id": "85b04a56-62a4-46db-9b92-499b09177afb",
"metadata": {},
"outputs": [],
"source": [
"# load data, set index, and workout total production in given unit\n",
"mix = pd.read_csv(\"version_2/input/3-energymix.csv\")\n",
"mix.set_index(\"Year\", inplace=True)\n",
"mix['Total'] = mix.sum(axis=1)"
]
},
{
"cell_type": "code",
2025-10-28 10:10:59 +01:00
"execution_count": 49,
2025-10-28 08:01:20 +01:00
"id": "d05090cd-2c40-4920-88df-97b8d2aec519",
"metadata": {},
"outputs": [],
"source": [
"# workout percentages in their columns\n",
"for column in mix:\n",
" mix[column + \"_percent\"] = mix[column] / mix.Total"
]
},
{
"cell_type": "code",
2025-10-28 10:10:59 +01:00
"execution_count": 36,
2025-10-28 08:01:20 +01:00
"id": "0a446974-6469-44ac-b406-88ab0247bbd1",
"metadata": {},
2025-10-28 10:10:59 +01:00
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABcAAAAKXCAYAAACln+kjAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAdGxJREFUeJzs3XmY5XldH/rP7yy19/Qyvc4wMJABGWBkQDBxzCPwiBk08hDQq9cQFFDRC5IQJFGJXrnRJBqjYYmSqxiEuKEXxI1tBhyc6dl6lp6e6em9u7r2fT/n1NnvH5OuTE1vVdV16tTyej1PPT3n9/v+vr939XSzvPvb329Sr9frAQAAAAAAm0yq2QEAAAAAAKARFOAAAAAAAGxKCnAAAAAAADYlBTgAAAAAAJuSAhwAAAAAgE1JAQ4AAAAAwKakAAcAAAAAYFNSgAMAAAAAsCkpwAEAAAAA2JQU4AAAAAAAbEoKcAAAAAAANiUFOAAAAAAAm1JmqQNrtVojcwAAAAAAXCSVsoaXlfOrBwAAAACATWnJK8BLpVIjcwAAAAAALJJOp60A55osuQDP5/ONzAEAAAAAsEhra2tks9lmx1gT3d3d8cIXvjAef/zxuP3225sdZ9NYcgEOAAAAALBeTUxMrOn7du3atazx73znO+Mzn/nMoudf+9rXxn/+z/85vvVbvzVuuummGBwcjN27d6921C3N3x8AAAAAAFgDb3rTm2JwcDAGBwfj61//emQymfj+7//+iHhmu5f9+/dHJmPN8mpSgAMAAAAArIHW1tbYv39/7N+/P26//fb4+Z//+ejt7Y3R0dHo7u6OJEni8OHDC+O/+c1vxrd/+7dHa2trHDhwIH7+538+KpXKwv3Xv/718f73vz8+8IEPxM6dO2Pfvn3xe7/3e5HL5eJd73pXbNu2LW655Zb48pe/vPBMtVqNH//xH48XvvCF0d7eHt/yLd8SH/vYxxblvOeee+Lbv/3bo7OzM3bs2BHf+Z3fGefPn4+IiCeeeCLe8IY3xLZt2+K6666Lb/u2b4tHHnmksT9x10ABDgAAAACwxubm5uIP//AP45Zbbonrr7/+ovv9/f3xfd/3ffHa1742nnjiifjkJz8Zv//7vx+/+qu/umjcZz7zmdi9e3c8/PDD8f73vz/+r//r/4r/4//4P+KOO+6Ixx57LP7JP/kn8Y53vGPhjMdarRbPe97z4s///M/j6aefjv/7//6/48Mf/nD82Z/9WUREVCqV+Gf/7J/F6173ujhy5Eg88MAD8Z73vCeSJImIiLe//e3xvOc9Lw4dOhSPPvpo/PzP//y63qc9qdfr9aUMXOs9dAAAAACAra21tTU6OzuXNHYj7AH+h3/4h9HW1hYREblcLg4cOBB/8zd/E69+9asvOgTz3/27fxef//zn49ixYwvl8+/8zu/Ez/3cz8X09HSkUql4/etfH9VqNe69996IeGZ19/bt2+Ntb3tbfPazn42IiKGhoThw4EA88MAD8Y/+0T+6ZLaf+ZmfiaGhofj//r//LyYmJuL666+Pe+65J173utddNPa6666LT3ziE/FjP/Zjy/r+m8UKcAAAAACANfCGN7whDh8+HIcPH46HH3447rzzzvje7/3ehe1Fnu3YsWPxHd/xHQvld0TEd37nd8bc3Fz09fUtXPvWb/3WhX9Op9Nx/fXXx2233bZwbd++fRERMTIysnDtt3/7t+Pbvu3bYs+ePdHV1RW/+7u/Gz09PRHxTLH/zne+M+68885485vfHB/72MdicHBw4dkPfvCD8RM/8RPxxje+MX7t134tzpw5swo/M42jAAcAAAAAWAOdnZ1xyy23xC233BKvfe1r41Of+lTkcrn4vd/7vRXP+dztR5IkWXTtQoFeq9UiIuJP//RP40Mf+lD8+I//eHzta1+Lw4cPx7ve9a4olUoLz3z605+OBx54IO6444743Oc+Fy95yUviwQcfjIiIj3zkI3H06NH4p//0n8Y3vvGNeNnLXhZ/8Rd/seL8jaYABwAAAABogiRJIpVKRaFQuOjerbfeGg888EA8ewfrgwcPxrZt2+J5z3veit958ODBuOOOO+K9731vvOpVr4pbbrnlkqu4X/WqV8Uv/MIvxP333x+veMUr4o//+I8X7r3kJS+Jf/2v/3V87Wtfi7e97W3x6U9/esV5Gk0BDgAAAACwBorFYgwNDcXQ0FAcO3Ys3v/+98fc3Fy8+c1vvmjse9/73ujt7Y33v//9cfz48fjLv/zL+OVf/uX44Ac/GKnUymvdF7/4xfHII4/EV7/61Th58mT80i/9Uhw6dGjh/rlz5+IXfuEX4oEHHojz58/H1772tTh16lTceuutUSgU4md+5mfinnvuifPnz8fBgwfj0KFDceutt644T6Nlmh0AAAAAAOBaLfdQymb4yle+EgcOHIiIiG3btsVLX/rS+PM///N4/etfH93d3YvG3njjjfGlL30p/s2/+Tfxyle+Mnbt2hU//uM/Hr/4i794TRl+6qd+Kh5//PH44R/+4UiSJH7kR34k3vve98aXv/zliIjo6OiI48ePx2c+85kYHx+PAwcOxPve9774qZ/6qahUKjE+Ph4/+qM/GsPDw7F79+5429veFv/P//P/XFOmRkrqz15DfwVrfYoqAAAAALC1tba2RmdnZ7NjsIHZAgUAAAAAgE1JAQ4AAAAAwKakAAcAAAAAYFNSgAMAAAAAsCkpwAEAAAAA2JQU4AAAAAAAbEoKcAAAAAAANiUFOAAAAAAAm5ICHAAAAACgyZIkiS9+8YtNeffrX//6+MAHPrCksffcc08kSRJTU1MNzbRaFOAAAAAAAA32zne+M5IkuejrTW96U0Pet5xC/Qtf+EL8yq/8ypLG3nHHHTE4OBjbt2+PiIg/+IM/iB07dqwwZeNlmh0AAAAAAOBaHTlyZE3f963f+q3LfuZNb3pTfPrTn150rbW1dbUiLVupVIqWlpbYtWvXkp9paWmJ/fv3NzDV6rICHAAAAABgDbS2tsb+/fsXfe3cufOSY3t7e+OHfuiHYseOHbFr1654y1veEt3d3YvG/I//8T/i5S9/ebS2tsaBAwfiZ37mZyIi4uabb46IiLe+9a2RJMnC54985CNx++23x6c+9al44QtfGG1tbRFx8RYoxWIxfu7nfi5uuummaG1tjVtuuSV+//d/PyIWb4Fyzz33xLve9a6Ynp5eWNH+kY98JP79v//38YpXvOKi7+n222+PX/qlX7qGn8HlU4ADAAAAAKwj5XI57rzzzti2bVvce++9cfDgwejq6oo3velNUSqVIiLik5/8ZLzvfe+L97znPfHkk0/GX/3VX8Utt9wSERGHDh2KiIhPf/rTMTg4uPA5IuL06dPx+c9/Pr7whS/E4cOHL/n+H/3RH40/+ZM/iY9//ONx7Nix+H//3/83urq6Lhp3xx13xEc/+tG47rrrYnBwMAYHB+NDH/pQvPvd745jx44teu/jjz8eR44ciXe9612r9dO0JLZAAQAAAABYA3/zN39zUZH84Q9/OD784Q8vuva5z30uarVafOpTn4okSSLimTJ7x44dcc8998Q/+Sf/JH71V381fvZnfzb+1b/6VwvPvfa1r42IiD179kRExI4dOy7arqRUKsVnP/vZhTHPdfLkyfizP/uzuOuuu+KNb3xjRES86EUvuuTYlpaW2L59eyRJsug9XV1dceedd8anP/3phUyf/vSn43Wve91l52oUBTgAAAAAwBp4wxveEJ/85CcXXbvU/ttPPPFEnD59OrZt27bo+vz8fJw5cyZGRkZiYGAgvvu7v3vZGV7wghdctvyOiDh8+HCk0+l43etet+y5n+0nf/In493vfnf81m/9VqRSqfjjP/7j+K//9b9e05wroQAHAAAAAFgDnZ2dC9uUXMnc3Fx827d9W/zRH/3RRff27NkTqdTKd7bu7Oy84v329vYVz/1sb37zm6O1tTX+4i/+IlpaWqJcLscP/uAPrsrcy6EABwAAAABYR1796lfH5z73udi7d29cd911lxxz8803x9e//vV4wxvecMn72Ww2qtXqst99222
"text/plain": [
"<Figure size 1700x800 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
2025-10-28 08:01:20 +01:00
"source": [
"# custom palette to prevent dark grey \"biomass\" to empty printer black ink\n",
"paletto = [\n",
" \"#ededed\",\n",
" \"#d1d1d1\",\n",
" \"#adadad\",\n",
" \"#828282\",\n",
" \"#5c5c5c\"\n",
"]\n",
"\n",
"# same settings as before\n",
"fig, ax = plt.subplots(figsize = (17,8))\n",
"ax.set_facecolor('#fdfdfd')\n",
"\n",
"# actual plot\n",
"ax.stackplot(\n",
" mix.index,\n",
" mix.Coal_percent,\n",
" mix.Oil_percent,\n",
" mix[\"Natural gas_percent\"],\n",
" mix.Electricity_percent,\n",
" mix.Biomass_percent,\n",
" colors = paletto[::-1]\n",
")\n",
"\n",
"# changed x axis labels anchor\n",
2025-10-28 10:10:59 +01:00
"plt.xticks(np.arange(1800, 2001, 50))\n",
2025-10-28 08:01:20 +01:00
"ax.get_yaxis().set_ticks([])\n",
2025-10-28 10:10:59 +01:00
"ax.get_xaxis().set_ticks([1800, 1850, 1900, 1950, 1995])\n",
"x_labels = [\"1800\", \"1850\", \"1900\", \"1950\", \"2000\"]\n",
"ax.set_xticklabels(x_labels)\n",
2025-10-28 08:01:20 +01:00
"ax.tick_params(length=4, color=\"white\")\n",
2025-10-28 10:10:59 +01:00
"plt.xticks(ha='left')\n",
2025-10-28 08:01:20 +01:00
"\n",
"# same clean look\n",
"ax.spines['top'].set_visible(False)\n",
"ax.spines['right'].set_visible(False)\n",
"ax.spines['bottom'].set_visible(False)\n",
"ax.spines['left'].set_visible(False)\n",
"ax.set_ymargin(0.005)\n",
"ax.set_xmargin(0)\n",
"\n",
"# legend\n",
"labels_legend = [\n",
" 'Coal',\n",
" 'Oil',\n",
" 'Natural gas',\n",
" 'Electricity',\n",
" 'Biomass'\n",
"]\n",
"ax.legend(labels=labels_legend, loc='right', bbox_to_anchor=(0.558, 0.5, 0.55, 0.832), edgecolor=\"white\", reverse=True)\n",
"\n",
"# output to file\n",
"plt.savefig(\"version_2/output/4_mix.png\")"
]
},
{
"cell_type": "markdown",
"id": "4cb24807-ee27-4f07-a850-a3d86b8ac20f",
"metadata": {},
"source": [
"__Note regarding x axis labels placement__\n",
"\n",
"In most of the plots (oil, raffinage, selected), labels on the x axis are \"anchored left of their ticks\". It means that they are shifted slightly to the right relative to the actual date. Their respective individual tick, placed on the x axis at the precise date, are aligned with the tip of the first character of the label, not the middle, as is the case with the above plot (mix).\n",
"This was done to prevent the first and last label to be visualy misaligned with the frame of the plot. The first label would be halfway out of the frame, and the last (2020) would be entirely inside the frame, as the source data have yearly datapoints until 2023.\n",
"Label have been shifted to visualy mark this imprecision. Conveying a sense of temporal blur, it underlines the function of these visual representations: these are not precise analytical tools, but allow the reader to perceive historical trends in the data."
]
},
{
"cell_type": "markdown",
"id": "6be6896b-fd0a-4ad9-8b39-d89dfbacec40",
"metadata": {},
"source": [
"# 5 - Energy balance"
]
},
2025-10-28 08:01:20 +01:00
{
"cell_type": "code",
2025-10-28 10:10:59 +01:00
"execution_count": 12,
"id": "8b157268-bb09-4cd9-98b1-d0f91a790430",
2025-10-28 08:01:20 +01:00
"metadata": {},
"outputs": [],
"source": [
"# load data, set index, and workout total production in given unit\n",
"balance = pd.read_csv(\"version_2/input/5-energybalance.csv\")\n",
"balance.set_index(\"Year\", inplace=True)\n",
"balance['Total'] = balance.sum(axis=1)"
]
},
{
"cell_type": "code",
2025-10-28 10:10:59 +01:00
"execution_count": 13,
"id": "4ae87e36-3268-4c74-acb6-8abd27cc9724",
"metadata": {},
"outputs": [],
"source": [
"# workout percentages in their columns\n",
"for column in balance:\n",
" balance[column + \"_percent\"] = balance[column] / balance.Total"
]
},
{
"cell_type": "code",
2025-10-28 10:10:59 +01:00
"execution_count": 28,
"id": "a825f3fe-ec3d-4ec4-b227-e38cd027f1c2",
"metadata": {},
2025-10-28 10:10:59 +01:00
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABcAAAAKXCAYAAACln+kjAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAeBZJREFUeJzs3XmUZPlZHuj3xpJrbV1drQ1aawu00BIWYo4xHgSWhAQjLIEwHlsDYhiGYSQGMAg4mDGbEUKeAcvISNgGPDZgzIxZ7GM8bDqWADGSEEKypK7el+qqysp9iyVjnz/aEWRVV3fXlhmZUc9zTpzMiuXGF1GZkRHv/e73KwaDwSAAAAAAADBhSuMuAAAAAAAA9oIAHAAAAACAiSQABwAAAABgIgnAAQAAAACYSAJwAAAAAAAmkgAcAAAAAICJJAAHAAAAAGAiCcABAAAAAJhIAnAAAAAAACaSABwAAAAAgIkkAAcAAAAAYCIJwAEAAAAAmEiVK71iv9/fyzoAAAAAAB6nVNLDy7Xz0wMAAAAAwES64g7wdru9l3UAAAAAAFykXC7rAOe6XHEA3mg09rIOAAAAAICLTE9Pp1qtjruMffHc5z433/3d353v/u7vTpIURZHf+q3fypve9Kax1nXYXXEADgAAAABwkKytre3r/Z08efKabvfoo4/mR37kR/K7v/u7WVlZyTOf+cy86U1vyg//8A/n1ltvTZL82Z/9Webn529kucQMcAAAAACAPfPggw/mla98Ze6777782q/9Wu6///78/M//fD7wgQ/kS77kS0Yh/m233Za5ubkxVzt5BOAAAAAAAHvk7W9/e6ampvL7v//7edWrXpVnP/vZ+aqv+qr84R/+Yc6dO5cf+qEfSvLYCJT3vOc94y12AgnAAQAAAAD2wNraWn7v934vb3vb2zI7O3vRZc94xjPylre8Jb/+67+ewWAwpgonnwAcAAAAAGAP3HfffRkMBnnxi1982ctf/OIXZ319PcvLy/tc2c1DAA4AAAAAsId0eI+PABwAAAAAYA/ccccdKYoip0+fvuzlp0+fzi233JLbbrttnyu7eQjAAQAAAAD2wK233prXvva1ed/73pdms3nRZRcuXMiv/uqv5m//7b+doijGVOHkE4ADAAAAAOyRf/pP/2larVZe97rX5Y/+6I/y6KOP5nd/93fz2te+Np/zOZ+Td77zneMucaJVxl0AAAAAAMC1OHny5LhLeEovfOEL8/GPfzw/8iM/km/4hm/I2tpanvGMZ+RNb3pTfuRHfuRQPIbDrBhc4QT2tbW1va4FAAAAAGBkeno68/Pz4y6DQ8wIFAAAAAAAJpIAHAAAAACAiSQABwAAAABgIgnAAQAAAACYSAJwAAAAAAAmkgAcAAAAAICJJAAHAAAAAGAiCcABAAAAAJhIAnAAAAAAACaSABwAAAAA4JB77nOfm/e85z3jLuPAqYy7AAAAAACAa/Ff/st/2df7e9nLXnZNt7tw4ULe+c535nd+53dy7ty5PO1pT8sXfuEX5ru/+7vz6le/+gZXyW4CcAAAAACAPfLwww/nS7/0S3PixIn8H//H/5E777wznU4nv/d7v5e3v/3tufvuu8dd4kQzAgUAAAAAYI+87W1vS1EU+djHPpY3v/nN+bzP+7y89KUvzfd8z/fkIx/5SJLkzJkzeeMb35gjR47k2LFj+YZv+IYsLi6OtvHAAw/kjW98Y57+9KfnyJEj+eIv/uL84R/+4bge0qEiAAcAAAAA2ANra2v53d/93bz97W/P/Pz84y4/ceJE+v1+3vjGN2ZtbS0f+tCH8gd/8Ad58MEH87f/9t8eXa9Wq+Wrv/qr84EPfCB/8Rd/kde//vX5mq/5mpw5c2Y/H86hZAQKAAAAAMAeuP/++zMYDPKiF73oCa/zgQ98IJ/+9Kfz0EMP5fbbb0+S/Ot//a/z0pe+NH/2Z3+WL/7iL87LX/7yvPzlLx/d5h/+w3+Y3/qt38p/+A//Id/xHd+x54/jMNMBDgAAAACwBwaDwVNe5/Tp07n99ttH4XeSvOQlL8mJEydy+vTpJI91gL/jHe/Ii1/84pw4cSJHjhzJ6dOndYBfAR3gAAAAAAB74IUvfGGKorjuhS7f8Y535A/+4A/yf/6f/2fuuOOOzM7O5uu//uvTbrdvUKWTSwc4AAAAAMAeOHnyZF73utfl537u51Kv1x93+cbGRl784hfn0UcfzaOPPjo6/6677srGxkZe8pKXJEk+/OEP55u/+ZvztV/7tbnzzjvzjGc8Iw8//PB+PYxDTQAOAAAAALBHfu7nfi69Xi//zX/z3+Q3fuM3ct999+X06dP52Z/92XzJl3xJXvOa1+TOO+/MW97ylnziE5/Ixz72sXzTN31TXvWqV+WVr3xlksc6yX/zN38zn/zkJ/OpT30qf/fv/t30+/0xP7LDwQgUAAAAAOBQetnLXjbuEp7S85///HziE5/IO9/5znzv935vFhYWctttt+WLvuiL8v73vz9FUeTf//t/n//tf/vf8mVf9mUplUp5/etfn/e+972jbfzMz/xMvuVbviV/7a/9tZw6dSo/8AM/kK2trTE+qsOjGFzJJPYka2tre10LAAAAAMDI9PR05ufnx10Gh5gRKAAAAAAATCQBOAAAAAAAE0kADgAAAADARBKAAwAAAAAwkQTgAAAAAABMJAE4AAAAAAATSQAOAAAAAMBEEoADAAAAADCRBOAAAAAAAEwkATgAAAAAwB66cOFCvuu7vit33HFHZmZm8vSnPz1f+qVfmve///1pNBrjLm+iVcZdAAAAAADAtfjN3/zNfb2/r/u6r7vq2zz44IP50i/90pw4cSI/+ZM/mTvvvDPT09P59Kc/nX/+z/95PudzPid/82/+zT2olkQHOAAAAADAnnnb296WSqWSj3/84/mGb/iGvPjFL87zn//8vPGNb8zv/M7v5Gu+5muSJD/zMz+TO++8M/Pz87n99tvztre9LbVabbSdRx55JF/zNV+TW265JfPz83npS1+a//Sf/tO4HtahoQMcAAAAAGAPrK6u5vd///fzkz/5k5mfn7/sdYqiSJKUSqX87M/+bJ73vOflwQcfzNve9rZ8//d/f973vvclSd7+9ren3W7nj/7ojzI/P5+77rorR44c2bfHclgJwAEAAAAA9sD999+fwWCQz//8z7/o/FOnTmVnZyfJY8H2u9/97nz3d3/36PLnPve5+Ymf+Il8+7d/+ygAP3PmTN785jfnzjvvTJI8//nP358HccgJwAEAAAAA9tHHPvax9Pv9vOUtb0mr1UqS/OEf/mHe9a535e67787W1la63W52dnbSaDQyNzeX7/zO78z/+r/+r/n93//9vOY1r8mb3/zmvOxlLxvzIzn4zAAHAAAAANgDd9xxR4qiyD333HPR+c9//vNzxx13ZHZ2Nkny8MMP5w1veENe9rKX5Td+4zfy53/+5/m5n/u5JEm73U6SfOu3fmsefPDBfOM3fmM+/elP55WvfGXe+9737u8DOoQE4AAAAAAAe+DWW2/Na1/72vzTf/pPU6/Xn/B6f/7nf55+v5+f/umfzl/9q381n/d5n5fz588/7nq33357vv3bvz2/+Zu/me/93u/Nv/gX/2Ivy58IAnAAAAAAgD3yvve9L91uN6985Svz67/+6zl9+nTuueee/Mqv/EruvvvulMvl3HHHHel0Onnve9+bBx98ML/8y7+cn//5n79oO9/93d+d3/u938tDDz2UT3ziE/nP//k/58UvfvGYHtXhYQY4AAAAAMAeecELXpC/+Iu/yE/+5E/mB3/wB3P27NlMT0/nJS95Sd7xjnfkbW97W+bm5vIzP/Mzefe7350f/MEfzJd92ZflXe96V77pm75ptJ1er5e3v/3tOXv2bI4dO5bXv/71+cf/+B+P8ZEdDsVgMBhcyRXX1tb2uhYAAAAAgJHp6enMz8+PuwwOMSNQAAAAAACYSAJwAAAAAAAmkgAcAAAAAICJJAAHAAAAAGAiCcABAAAAAJhIAnAAAAAAACaSABwAAAAAgIkkAAcAAAAAYCIJwAEAAAAAmEgCcAA
"text/plain": [
"<Figure size 1700x800 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# custom palette matches the biomass one\n",
"paletto = [\n",
" \"#ededed\",\n",
" \"#d1d1d1\",\n",
" \"#adadad\",\n",
" \"#828282\",\n",
" \"#5c5c5c\"\n",
"]\n",
"\n",
"# same settings as before\n",
"fig, ax = plt.subplots(figsize = (17,8))\n",
"ax.set_facecolor('#fdfdfd')\n",
"\n",
"# actual plot\n",
"ax.stackplot(\n",
" balance.index,\n",
" balance.Renewables_percent,\n",
" balance[\"Nuclear consumption - TWh_percent\"],\n",
" balance[\"Gas consumption - TWh_percent\"],\n",
" balance[\"Coal consumption - TWh_percent\"],\n",
" balance[\"Oil consumption - TWh_percent\"],\n",
" colors = paletto[::-1]\n",
")\n",
"\n",
"# custom x axis labels because data starts earlier\n",
"start = np.array([1965])\n",
"middle = np.arange(1970, 2019, 10)\n",
"end = np.array([2020])\n",
"ticks_array = np.concatenate((start, middle, end), axis=0)\n",
"plt.xticks(ticks_array)\n",
"ax.get_yaxis().set_ticks([])\n",
"ax.tick_params(length=4, color=\"white\")\n",
2025-10-28 10:10:59 +01:00
"#ax.tick_params(rotation=35)\n",
"plt.xticks(ha='left')\n",
"\n",
"# same clean look\n",
"ax.spines['top'].set_visible(False)\n",
"ax.spines['right'].set_visible(False)\n",
"ax.spines['bottom'].set_visible(False)\n",
"ax.spines['left'].set_visible(False)\n",
"ax.set_ymargin(0.005)\n",
"ax.set_xmargin(0)\n",
"\n",
"# legend\n",
"labels_legend = [\n",
2025-10-28 09:14:28 +01:00
" 'Renewables',\n",
" 'Nuclear',\n",
" 'Gas',\n",
" 'Coal',\n",
" 'Oil',\n",
"]\n",
"ax.legend(labels=labels_legend, loc='right', bbox_to_anchor=(0.558, 0.5, 0.55, 0.832), edgecolor=\"white\", reverse=True)\n",
"\n",
"# output to file\n",
"plt.savefig(\"version_2/output/5_balance.png\")"
]
},
{
"cell_type": "markdown",
"id": "40b58100-f567-4468-826a-c7826a8f4e17",
"metadata": {},
"source": [
"__Note regarding input data pre-processing__\n",
"\n",
"All datasets have been manually collected, curated, corrected for formatting error, converted to csv with appropriate headers and verified."
]
2025-10-28 08:01:20 +01:00
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.9"
}
},
"nbformat": 4,
"nbformat_minor": 5
}