#! /usr/bin/env python3# -*- coding:utf8 -*-from copy import deepcopyfrom lxml import etreeimport matplotlib.pyplot as pltimport matplotlib.ticker as ticker# data source: https://www.eia.gov/international/data/country/FRA/electricity/electricity-generationyears_hydro_nuclear_fossil_renew = [[1980, [68.253, 63.424, 117.986, 1.122] ],[1981, [70.358, 99.235, 91.393, 1.228] ],[1982, [68.6, 102.627, 91.954, 1.644] ],[1983, [67.515, 135.988, 75.848, 1.256] ],[1984, [64.01, 180.47, 60.961, 1.455] ],[1985, [60.248, 211.192, 52.251, 1.322] ],[1986, [60.953, 239.558, 40.547, 1.403] ],[1987, [68.623, 249.265, 37.363, 1.418] ],[1988, [73.952, 260.287, 35.742, 1.388] ],[1989, [45.744, 288.715, 48.492, 2.039] ],[1990, [52.796, 298.377, 44.291, 2.203] ],[1991, [56.277, 314.773, 56.721, 2.397] ],[1992, [68.313, 321.523, 47.222, 2.437] ],[1993, [64.3, 349.779, 32.276, 2.298] ],[1994, [78.057, 341.982, 31.382, 2.494] ],[1995, [72.196, 358.37, 35.791, 2.767] ],[1996, [64.43, 377.473, 40.343, 2.954] ],[1997, [63.151, 375.709, 36.181, 3.3] ],[1998, [61.479, 368.591, 50.702, 3.314] ],[1999, [71.832, 374.532, 46.275, 3.779] ],[2000, [66.466, 394.404, 46.5667, 4.216] ],[2001, [73.888, 400.018, 42.3047, 4.996] ],[2002, [59.992, 414.922, 48.0594, 5.389] ],[2003, [58.567, 419.017, 52.3862, 5.808] ],[2004, [59.276, 425.829, 51.5233, 6.15] ],[2005, [50.965, 431.18, 57.9971, 6.47] ],[2006, [55.741, 429.82, 51.9792, 7.61] ],[2007, [57.029, 420.129, 52.9662, 10.382] ],[2008, [63.017, 419.8, 50.9245, 12.265] ],[2009, [56.428, 391.753, 46.3834, 14.919] ],[2010, [61.945, 410.086, 52.2602, 17.641] ],[2011, [45.184, 423.509, 53.7906, 22.977] ],[2012, [59.099, 407.438, 50.9132, 28.306] ],[2013, [71.042, 403.7, 48.0481, 30.278] ],[2014, [62.993, 418.001, 31.4007, 33.041] ],[2015, [54.876, 419.022, 39.8128, 39.224] ],[2016, [60.094, 386.453, 50.9358, 41.095] ],[2017, [49.389, 381.846, 58.9211, 45.725] ],[2018, [64.485, 393.2, 44.4009, 51.149] ],[2019, [56.9824, 382.403, 48.0932, 61.6045] ] ][2020, [62, 335, 45, 65] ] ][2021, [59, 361, 48, 64] ] ]# please update in future.years = [row[0] for row in years_hydro_nuclear_fossil_renew]hydro = [row[1][0] for row in years_hydro_nuclear_fossil_renew]nuclear = [row[1][1] for row in years_hydro_nuclear_fossil_renew]fossil = [row[1][2] for row in years_hydro_nuclear_fossil_renew]renew = [row[1][3] for row in years_hydro_nuclear_fossil_renew]fname = "Electricity in France.svg"labels = {'title': {"en":"Electricity production in France", "de":"Stromerzeugung in Frankreich", "fr":"Production d'électricité en France", "es":"Producción de electricidad en Francia"}, "hydro":{"en":"Hydroelectric ", "de":"Wasserkraft", "fr":"Hydroélectricité", "es":"Hidroeléctrica"}, "nuclear":{"en":"Nuclear", "de":"Nuklear", "fr":"Nucléaire", "es":"Nuclear"}, "fossil":{"en":"Fossil", "de":"Fossiler Kohlenstoff", "fr":"Carbone fossile", "es":"Carbono fósil"}, "renew":{"en":"Renewable", "de":"Erneuerbar", "fr":"Renouvelable", "es":"Renovable"} }plt.rcParams.update({'text.usetex':False, "svg.fonttype":"none", "font.size":13})fig = plt.figure(figsize=(680 / 90.0, 450 / 90.0), dpi=72)plt.stackplot(years, hydro, nuclear, fossil, renew, ec='k', lw=0.5, colors=['#0072B2', '#F0E442', '#D55E00', '#009E73'], labels=[labels["hydro"]["en"], labels["nuclear"]["en"], labels["fossil"]["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, 600)plt.ylabel('TWh')plt.title(labels["title"]["en"], fontweight='bold')plt.grid(True)hand, lab = plt.gca().get_legend_handles_labels()plt.gca().legend(hand[::-1], lab[::-1], loc='upper left', borderaxespad=0.6)plt.tight_layout()plt.savefig(fname)# create multilingual labels with the svg switch elementwith open(fname, "r") as svgfile: svg = etree.parse(svgfile, etree.XMLParser()).getroot()for label, values in labels.items(): for el in svg.findall(".//{" + svg.nsmap[None] + "}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: svgfile.write(etree.tostring(svg, pretty_print=True, encoding="unicode"))