[La boite à outils du peakiste] diagrammes de sankey

Présentation de livres, de films ou de sites traitant de la déplétion ou de sujet connexes.

Modérateurs : Rod, Modérateurs

Avatar de l’utilisateur
Raminagrobis
Modérateur
Modérateur
Messages : 5051
Inscription : 17 août 2006, 18:05
Localisation : Tours, Lille parfois

[La boite à outils du peakiste] diagrammes de sankey

Message par Raminagrobis » 11 janv. 2016, 19:53

Les diagrammes de sankey sont trés utiles quand on veut représenter des flux quantitatifs qui se séparent, et/ou se réunissent. Ils représentent les flux par des traits de largeur proportionnelle à leur importance. L'EIA par exemple en réalise énormément pour représenter les fleux énergétiques :Lien le diagramme de sankey de l'énergie mondiale.

Malheureux, peu d'outils existent pour en faire. Ce n'est pas intégré dans des tableurs, et il existent un ou deux outils en ligne mais rien d'extraordinaire. Le peakiste doit donc faire un peu de programmation. Il existe en effet une toolbox pour Python nommée Matplotlib qui permet, entre plein d'autres choses, de réaliser des diagrammes de Sankey. Installer matplotlib sous python standard est un peu pénible (faut installer une demi douzaine d'autres librairies avant) je me suis donc tourné vers Spyder, qui est une plate forme de développement python intégrant des dizaines de librairies à usage scientifique. Je suis flemmard. :mrgreen:

Voici un petit exemple : diagramme de Sankey du raffinage du pétrole aux états-Unis.

Voici le code pour le produire :

Code : Tout sélectionner

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.sankey import Sankey




fig = plt.figure()
#
#
ax = fig.add_subplot(1, 1, 1, xticks=[], yticks=[],
                      title="Raffinage aux Etats-Unis")
flows = [ 7.344, 8.708	, -16.052*0.45, -16.052*0.3, -16.052*0.1,-16.052*0.15 	]
#
#
sankey = Sankey(ax=ax,scale = 8e-3,  unit='Mb/j')


sankey.add(flows=flows, label='one', patchlabel="Raffinage",trunklength =0.4,
           orientations=[-1, 1, 1, 1, -1, -1], labels = ['brut importé ','production nationale', 'essence', 'diesel', 'jet fuel', 'autres'])
Ca sort un diagramme comme ça :
sankey_usraf.png
Et surtout Matplotlib a le bon gout de le sortir en svg, un format vectoriel. Une image vectoriel est décrite par des éléments géométriques et non par un tableau de pixel, ce qui a pour principal avantage qu'on la redimensionner indéfiniment sans perte de qualité.

Je peux donc exporter en svg, et retoucher l'image avec inkscape pour le coté cosmétique. Par exemple je vire les axes (inutiles), je fait un dégradé (qui a dit "c'est kitsh" dans le fond du forum?) et je met des tites icônes :
sankey_usraf2.png
Bref, j'invite les personnes intéressées à se mettre à ces outils, c'est pas si dur que ça à prendre en main, et c'est tout gratuit.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Toujours moins.

Avatar de l’utilisateur
energy_isere
Modérateur
Modérateur
Messages : 54132
Inscription : 24 avr. 2005, 21:26
Localisation : Les JO de 68, c'était la
Contact :

Re: [La boite à outils du peakiste] diagrammes de sankey

Message par energy_isere » 11 janv. 2016, 19:56

hi hi hi, il va y a voir très bientôt une toute petite fléche qui va partir en Brut exporté, puisque que la levée de l' interdiction à été donnée aux USA.

Avatar de l’utilisateur
Raminagrobis
Modérateur
Modérateur
Messages : 5051
Inscription : 17 août 2006, 18:05
Localisation : Tours, Lille parfois

Re: [La boite à outils du peakiste] diagrammes de sankey

Message par Raminagrobis » 11 janv. 2016, 20:27

Leçon 2 :-D

Evidemment, un diagramme de Sankey avec un seul bloc présente peu d'intérêt. Tout l'objet de ce type de graphe, c'est de connecter entre elles plusieurs boites.

Voici donc comment on fait :
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, xticks=[], yticks=[],
title="Raffinage aux Etats-Unis")
flows = [ 7.344, 8.708 , -16.052*0.45, -16.052*0.3, -16.052*0.1,-16.052*0.15 ]
sankey = Sankey(ax=ax,scale = 8e-3, unit='Mb/j')


sankey.add(flows=flows, label='one', patchlabel="Raffinage",trunklength =0.4,
orientations=[-1, 1, 1, 1, -1, -1], labels = [' ','production nationale', 'essence', 'diesel', 'jet fuel', 'autres'])

sankey.add(flows=[1.159,2.882 ,3.303,-7.344], label='one', patchlabel="Brut importé",trunklength =0.4,
orientations=[0, -1, 1, 1], labels = ['Arabie Saoudite','Canada','Autres', ' '],
prior = 0, connect = (0, 3))
Les diagrammes qu'on ajoute sont numérotés automatiquement à partir de 0. Ici j'en ai deux, c'est donc 0 et 1. Dans le définition du 1, je précise qu'il doit être relié au zéro avec l'argument prior = 0.

Je précise ensuite que c'est la 1e quantité (notée 0) du graphe 0 qui doit être reliée à la 4e quantité (notée 3) du graphe 1.
sankey4.png
Les orientations définissent dans quelle sens (haut ou bas) vont les flèches par rapport au tronc central. Les quantités positives sont les flux entrants, les négatives les flux sortants.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Toujours moins.

Répondre