************** Les dashboards ************** L'interaction avec les graphiques est possible dans un contexte statique mais limitée car elle n'agit que sur la présentation de données pré chargées dans le fichier JavaScript. C'est là qu'intervient le dashboard, qui est en fait une application client serveur, le client se chargeant de la présentation des données alors que la sélection est gérée côté serveur. Dans l'éco système Python la technologie Dash/Plotly est utilisée. C'est l'équivalent de `R/Shiny `_. Dash overview ============= `Dash `_ est un framework Python permettant de développer des applications web pour la visualisation des données. Il est construit sur des technologies matures et largement déployées: - `Flask `_ est un micro framework web Python - `Plotly `_ est une bibliothèque graphique basée sur `D3.js `_, la référence en matière de data visualisation - `React `_. est une bibliothèque JavaScript développée par Facebook Architecture ------------ Dash propose une couche d'abstraction au dessus des technologies présentées ci dessus et des protocoles requis pour développer ce type d'application. Les applications sont déployées et partagées à travers un navigateur web. Chris Parmer, le fondateur de Dash, expose les principales caractéristiques du framework dans `une présentation vidéo YouTube `_. .. raw:: html - Côté front end, Les composants HTML sont générés par React dont l'ensemble des composants est donc disponible pour le design de la page web. - Côté back end, une application Dash est une instance d'une application Flask dont toutes les propriétés sont configurables. L'ensemble des plugins Flask est donc disponible pour une utilisation avancée. Les composants Dash sont des classes Python permettant de packager les composants React. Ceux ci sont sérialisés au format JSON et transférés au front end via des requêtes HTTP. Un premier dashboard ==================== Un dashboard Dash est une application Flask. Le code ci dessous permet de produire un graphique élémentaire. Il est écrit avec la version ``1.13.3`` de Dash. .. code-block:: python :linenos: # filename = 'dash-01.py' # # Imports # import plotly_express as px import dash import dash_core_components as dcc import dash_html_components as html # # Data # year = 2002 gapminder = px.data.gapminder() # (1) years = gapminder["year"].unique() data = { year:gapminder.query("year == @year") for year in years} # (2) # # Main # if __name__ == '__main__': app = dash.Dash(__name__) # (3) fig = px.scatter(data[year], x="gdpPercap", y="lifeExp", color="continent", size="pop", hover_name="country") # (4) app.layout = html.Div(children=[ html.H1(children=f'Life expectancy vs GDP per capita ({year})', style={'textAlign': 'center', 'color': '#7FDBFF'}), # (5) dcc.Graph( id='graph1', figure=fig ), # (6) html.Div(children=f''' The graph above shows relationship between life expectancy and GDP per capita for year {year}. Each continent data has its own colour and symbol size is proportionnal to country population. Mouse over for details. '''), # (7) ] ) # # RUN APP # app.run_server(debug=True) # (8) - On collecte les données (1) - On crée un dictionnaire dont les clés sont les années et les valeurs, les données de l'année concernée (2) - On crée une instance de la classe Dash (3) - on crée la figure destinée à être affichée dans le dashboard (4) - la page est composée d'éléments HTML standard (5)(7) - la bibliothèque Dash Core Components fournit l'élément Graph qui permet d'inclure un graphique Plotly/Plotly Express (6) - lancement de l'application (8) Cette application est lancée dans une console:: $ python3 dash-01.py Dash is running on http://127.0.0.1:8050/ Warning: This is a development server. Do not use app.run_server in production, use a production WSGI server like gunicorn instead. * Serving Flask app "dash-01" (lazy loading) * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: on Et le résultat s'observe dans la fenêtre d'un navigateur à l'adresse indiquée dans la console (ici ``http://127.0.0.1:8050/``) .. image:: images/03-fig01.png :scale: 75 % :align: center Le code source de la page est simple et structuré. Le rendu est confié aux fonctions JavaScript encapsulées dans le ``