.. LINFO1002 documentation master file, created by
sphinx-quickstart on Tue Jan 28 18:06:33 2020.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
.. _ref-chartjs:
La visualisation via ``chart.js``
=================================
Lorsque l'on est face à de grandes quantités d'informations, il est
important de pouvoir les visualiser correctement pour pouvoir
en tirer des conclusions. De nombreux logiciels permettent de visualiser
des données numériques sous différentes formes. Dans le cadre de
ce projet, votre objectif est de développer un site web interactif qui présente
des données de façon graphique. Une première approche pour construire
un tel site web pourrait être de produire ces graphiques directement
en python avec `matplotlib ` par exemple et
d'intégrer les images produites dans des pages HTML. Malheureusement,
une telle approche serait lourde à mettre en oeuvre. Il est préférable de passer par des librairies
spécialisées dans la visualisation d'information via le web.
Dans le cadre de ce projet, vous utiliserez `Chart.js ` qui est assez simple à mettre en oeuvre tout en donnant un excellent
résultat au niveau graphique. `Chart.js ` est une
librairie codée en `Javascript `_. Javascript est un langage de programmation qui
est utilisé par les navigateurs pour avoir des pages HTML qui s'adaptent
dynamiquement. On peut voir Javascript comme étant une extension de HTML sur
le web. Dans le cadre de ce projet, nous nous concentrerons sur l'utilisation
de `Chart.js ` dans une page HTML. L'utilisation
complète de Javascript sort du cadre de ce cours.
Un graphique `Chart.js` est toujours inclus dans une zone rectangulaire
définie par l'élément HTML5 `canvas` (canevas en français).
Celui-ci supporte plusieurs attributs dont
les plus importants sont :
- `id` qui permet de donner un nom unique au canevas;
- `width` qui permet de spécifier la largeur du canevas;
- `height` qui permet de spécifier la hauteur du canevas.
L'exemple ci-dessous illustre la déclaration d'un tel canevas. L'identifiant
permet de faire référence à ce canevas dans une feuille de style, mais surtout
dans le code Javascript qui utilise la librairie `Chart.js`.
.. code-block:: html
Vous pouvez maintenant facilement afficher un graphique en bâtonnets dans une
page HTML. Pour cela, il faut d'abord charger la librairie `Chart.js` dans
l'entête de votre page HTML en utilisant la balise ``. Il n'est pas nécessaire de
connaître Javascript pour pouvoir utiliser cette librairie. Il suffit de
consulter les nombreux exemples disponibles dans la `documentation de Chart.js
`_. La création d'un graphique
prend en général deux instructions Javascript. La première est la
ligne qui indique à Javascript d'associer à la variable `ctx`
le canevas dont l'identifiant est passé en argument à
la méthode `document.getElementById()`. Cette méthode permet de
récupérer dans la page HTML courante l'élément dont l'identifiant est fourni.
Toutes les
lignes en Javascript se terminent par le caractère `;` contrairement à
python. En Javascript, les caractères `//` marquent le début d'un commentaire.
.. code-block:: javascript
var ctx = document.getElementById('graphique').getContext('2d');
La second ligne du script crée le graphique `new Chart(ctx, ...);` et
l'associe au canevas identifié par la variable `ctx` définie à la ligne précédente. Le deuxième argument spécifie le type du graphique `type: 'bar'`, les
données numériques à afficher (`data`) et les étiquettes à utiliser. Dans cet
exemple, nous affichons les votes reçus par six étudiants. Le code HTML complet
est repris ci-dessous ainsi que sa visualisation dans un navigateur.
.. literalinclude:: figures/chartjs/simple.html
:language: html
.. figure:: figures/chartjs/batonnets.png
Exemple de diagramme en bâtonnets avec ``Chart.js``
Lorsque l'on écrit ses premiers scripts en Javascript, on peut parfois faire
des erreurs de syntaxe difficiles à identifier et corriger. Heureusement,
les navigateurs modernes comprennent des outils qui facilitent la vie
des développeurs et leur permettent de corriger rapidement ces erreurs.
Prenons Chrome comme exemple, mais Firefox ou Safari supportent
les mêmes fonctionnalités. Vous pouvez activer les outils pour développeurs
de Chrome en cliquant sur les trois points verticaux en haut à droite de la fenêtre puis `More Tools` et enfin `Developer Tools`. Ce menu est aussi disponible
en tapant `Ctrl+Shift+I`. Vous verrez alors apparaître différents outils dont
la liste des éléments contenus dans la page HTML, une console avec les
éventuels messages d'erreur, un accès aux sources de la page, ...
Ajoutons dans la page HTML ci-dessus une erreur
dans les étiquettes en oubliant la première apostrophe avant le prénom `Jean`.
Chrome n'affiche rien car il y a une erreur de syntaxe dans le javascript à
la ligne 23.
.. figure:: figures/chartjs/chrome-err.png
Erreur affichée dans la console de Chrome
En cliquant sur la ligne en erreur, Chrome affiche plus de détails qui en
facilitent sa correction.
.. figure:: figures/chartjs/chrome-err2.png
Plus d'informations sur l'erreur dans la console de Chrome
La librairie `Chart.js` supporte de très nombreux types de graphes. Chaque type
de graphique supporte des dizaines d'options que vous pouvez combiner à
votre guise.
Lorsque l'on doit visualiser de grandes quantités de données, comme par exemple
les points à un examen, il peut être intéressant de regrouper ces données.
Prenons le fichier :download:`figures/chartjs/data.csv` qui contient les
résultats de 468 étudiants à une interrogation. Cet ensemble de données peut
être visualisé de nombreuses façons.
Une solution naïve est de simplement afficher les points de chaque étudiant dans
l'ordre de leur numéro d'inscription. Le résultat est complètement illisible
et n'apporte aucune information utile.
.. figure:: figures/chartjs/stud-1.png
Une mauvaise visualisation des points des étudiants
Une deuxième approche est de regarder le nombre d'étudiants qui ont obtenu
chacune des cotes. Avec potentiellement 100 cotes différentes, cela rend
un graphique qui reste difficile à interpréter.
.. figure:: figures/chartjs/stud-2.png
Le nombre d'étudiants pour chaque cote
Une meilleure approche est de regrouper les points obtenus par les étudiants
en classes, par exemple de 0-9, de 10 à 19, ... et de compter le nombre
d'étudiants dans chaque classe.
.. figure:: figures/chartjs/stud-3.png
Le nombre d'étudiants pour chaque classe
Une dernière approche est de trier les cotes de façon croissante. Cela permet
de facilement visualiser le nombre d'étudiants qui ont plus ou moins qu'une
certaine cote.
.. figure:: figures/chartjs/stud-4.png
Visualisation des cotes en ordre croissant
Les exemples ci-dessus sont illustratifs. Vous pouvez certainement faire
beaucoup mieux que ces exemples entièrement gris. Dans le cadre de ce projet, vous avez toute la liberté pour proposer une solution de visualisation qui permet
aux professeurs de visualiser les résultats des étudiants sur INGInious. Vous
trouverez de très nombreux livres et références sur la visualisation de
données. Le livre `Fundamentals of Data Visualization ` écrit par Claus Wilke fournit de très nombreuses astuces
et règles de bonne pratique.
Continuez votre lecture avec le document :doc:`flask`.