#! /usr/bin/env python3
# -*- coding:utf8 -*-
from copy import deepcopy
import numpy as np
from lxml import etree
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
# data source: https://www.eia.gov/international/data/world/electricity/electricity-generation
years_fossil_nuclear_renew = [
[1980, [5.5891, 0.6844, 1.7539] ],
[1981, [5.5258, 0.7786, 1.7794] ],
[1982, [5.5636, 0.8664, 1.8332] ],
[1983, [5.7030, 0.9817, 1.9181] ],
[1984, [5.9130, 1.1969, 1.9855] ],
[1985, [6.0409, 1.4255, 2.0062] ],
[1986, [6.1013, 1.5177, 2.0512] ],
[1987, [6.3962, 1.6540, 2.0613] ],
[1988, [6.6097, 1.7948, 2.1406] ],
[1989, [7.0517, 1.8434, 2.1773] ],
[1990, [7.1363, 1.9088, 2.2785] ],
[1991, [7.2382, 1.9961, 2.3280] ],
[1992, [7.2813, 2.0156, 2.3452] ],
[1993, [7.3594, 2.0816, 2.4760] ],
[1994, [7.5609, 2.1252, 2.5069] ],
[1995, [7.7875, 2.2100, 2.6320] ],
[1996, [8.0477, 2.2915, 2.6745] ],
[1997, [8.3266, 2.2713, 2.7449] ],
[1998, [8.6168, 2.3160, 2.7621] ],
[1999, [8.8243, 2.3931, 2.8191] ],
[2000, [9.3399, 2.4499, 2.8948] ],
[2001, [9.5661, 2.5169, 2.8556] ],
[2002, [9.9863, 2.5456, 2.9244] ],
[2003, [10.5108, 2.5177, 2.9619] ],
[2004, [10.9670, 2.6189, 3.1710] ],
[2005, [11.4492, 2.6250, 3.3304] ],
[2006, [11.9643, 2.6598, 3.4734] ],
[2007, [12.7698, 2.6080, 3.5741] ],
[2008, [12.8587, 2.5973, 3.7778] ],
[2009, [12.6853, 2.5600, 3.9250] ],
[2010, [13.6207, 2.6297, 4.2373] ],
[2011, [14.2404, 2.5177, 4.4501] ],
[2012, [14.5490, 2.3448, 4.7659] ],
[2013, [14.8978, 2.3642, 5.0993] ],
[2014, [15.0247, 2.4089, 5.3332] ],
[2015, [15.2056, 2.4405, 5.5535] ],
[2016, [15.4309, 2.4688, 5.9660] ],
[2017, [15.948, 2.517, 6.266] ],
[2018, [16.304, 2.570, 6.681] ],
[2019, [16.790, 2.677, 7.066] ],
[2020, [16.415, 2.593, 7.557] ],
[2021, [17.270, 2.697, 7.981] ],
[2022, [17.412, 2.594, 8.630] ],
[2023, [17.498, 2.666, 9.004] ]
]
# please update in future.
years = np.array([row[0] for row in years_fossil_nuclear_renew])
fossil = np.array([row[1][0] for row in years_fossil_nuclear_renew])
nuclear = np.array([row[1][1] for row in years_fossil_nuclear_renew])
renew = np.array([row[1][2] for row in years_fossil_nuclear_renew])
fname = "Annual world electricity net generation.svg"
labels = {'title': {"en":"Annual Electricity Net Generation in the World",
"de":"Weltweite jährliche Netto-Stromerzeugung",
"fr":"Production annuelle nette d'électricité dans le monde",
"nl":"Elektriciteitsopwekking per jaar in de wereld",
"pl":"Roczna światowa produkcja energii elektrycznej netto",
"ru":"Годовая чистая выработка электроэнергии в мире"},
"fossil":{"en":"Fossil carbon ", "de":"Fossiler Kohlenstoff",
"fr":"Carbone fossile", "nl":"Fossiele koolstof",
"pl":"paliwa kopalne (węgiel/gaz ziemny/ropa naftowa)", "ru":"ископаемый углерод"},
"nuclear":{"en":"Nuclear", "de":"Nuklear", "fr":"Nucléaire",
"nl":"Nucleair", "pl":"elektrownie jądrowe", "ru":"атомная"},
"renew":{"en":"Renewable", "de":"Erneuerbar", "fr":"Renouvelable",
"nl":"Duurzaam", "pl":"źródła odnawialne", "ru":"возобновляемый"} }
plt.rcParams.update({'text.usetex':False, "svg.fonttype":"none", "font.size":14})
fig = plt.figure(figsize=(960 / 90.0, 480 / 90.0), dpi=72)
plt.stackplot(years, fossil, nuclear, renew, ec='k', lw=0.5,
colors=['#aa7700', '#e5dd00', '#00aa00'],
labels=[labels["fossil"]["en"], labels["nuclear"]["en"], labels["renew"]["en"]])
plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(10))
plt.gca().xaxis.set_minor_locator(ticker.MultipleLocator(1))
plt.xlim(years[0], years[-1])
plt.ylim(0)
plt.ylabel('PWh')
plt.title(labels["title"]["en"], fontweight='bold')
plt.grid(True)
plt.gca().legend(loc='upper left', framealpha=1, borderaxespad=2)
plt.tight_layout()
plt.savefig(fname)
# create multilingual labels with the svg switch element
with open(fname, "r") as svgfile:
svg = etree.parse(svgfile, etree.XMLParser()).getroot()
nsmap = "{" + svg.nsmap[None] + "}"
for label, values in labels.items():
for el in svg.findall('.//' + nsmap + 'text'):
if el.text == values["en"]:
switch = etree.SubElement(el.getparent(), "switch")
for lang, text in values.items():
el2 = deepcopy(el)
el2.set("systemLanguage", lang)
el2.text = text
switch.append(el2)
switch.append(el)
#with open(fname, "w") as svgfile:
with open(fname, mode='w', encoding='utf-8') as svgfile:
svgfile.write(etree.tostring(svg, pretty_print=True, encoding="unicode"))