Série 10 – Diagrammes à tige et à feuilles

Introduction

Le but de cette série est d'ajouter au tableur ultra-simplifié du cours la possibilité de dessiner des diagrammes à tige et à feuille pour un certain nombre de cellules, et d'utiliser cette possibilité pour visualiser les résultats de l'examen intermédiaire.

Un diagramme à tige et à feuille (stem-and-leaf plot ou parfois stemplot en anglais) permet de visualiser la distribution d'un ensemble de valeurs entières. Il est similaire à un histogramme à barres horizontales, mais dont les barres sont les chiffres des unités des valeurs elle-mêmes.

Par exemple, admettons l'existence d'une équipe de 14 jeunes sportifs dont la taille en centimètres est { 152, 152, 154, 160, 161, 161, 162, 163, 163, 173, 173, 175, 175, 178 }. Pour créer un diagramme à tige et à feuille à partir de ces données, on commence par séparer chaque valeur en une tige, composée de tous les chiffres sauf celui des unités, et une feuille, le chiffre des unités. Par exemple, la valeur 152 a pour tige 15 et pour feuille 2, tandis que la valeur 154 a également 15 comme tige mais 4 comme feuille. Cette séparation faite, on produit le diagramme en affichant une ligne par tige possible entre la plus petite et la plus grande tige trouvées dans les données. Chaque ligne est composée de la tige qui lui correspond, suivie d'une barre verticale et de toutes les feuilles ayant cette tige, triées en ordre croissant. Pour les valeurs données plus haut, on obtient le diagramme suivant :

15|224
16|011233
17|33558

Un tel diagramme permet d'une part de visualiser la distribution des données, puisque la longueur de chaque ligne est proportionnelle au nombre de valeurs ayant la tige correspondant à la ligne, et d'autre part de connaître précisément les valeurs présentes dans les données. Ainsi, au moyen du diagramme ci-dessus, il est trivial de reconstituer la totalité des données.

Pour démarrer, nous vous fournissons une archive Zip contenant :

  1. trois fichier de données nommés data.txt, data_IN.txt et data_SC.txt, le premier contenant les points (arrondis) obtenus lors de l'examen intermédiaire du cours par les 237 étudiant(e)s l'ayant effectué (la première ligne donne le nombre d'entrées, les suivantes donnent les points), les deux autres donnant les mêmes informations mais séparées par section,
  2. une version simplifiée du « tableur » décrit dans le cours, dont la classe SumCell, inutile ici, a été supprimée, et les classes Cell et ValueCell ont été fusionnées,
  3. une classe Main qui construit autant de cellules qu'il y a de valeurs dans le fichier data.txt, construit ensuite une instance de StemPlot pour les afficher et finalement lit les données du fichier pour les placer dans les cellules successives,
  4. un squelette à compléter de classe StemPlot, qui dessine sur la console (System.out) un diagramme à tige et à feuille pour les valeurs contenues dans une liste de cellules.

Exercice 1 : Diagramme unidirectionnel

Complétez la classe StemPlot qui modélise un diagramme à tige et à feuille dont les données proviennent de cellules du tableur. Cette classe doit utiliser le fait que les cellules sont observables pour se mettre à jour (c-à-d se dessiner à nouveau sur la console) chaque fois que la valeur d'une des cellules change.

Notez qu'utiliser le patron Observer ici n'est pas vraiment judicieux mais prendrait tout son sens si StemPlot modélisait effectivement un diagramme dans un tableur interactif, car celui-ci devrait alors se mettre à jour automatiquement lors d'un changement des données représentées.

Conseil : utilisez judicieusement les collections que vous connaissez ainsi que les méthodes de la bibliothèque Java. En particulier, sachez qu'il est possible de calculer la valeur maximum ou minimum d'une collection au moyen des méthodes min et max de Collections, et qu'il est possible de trier une liste au moyen de la méthode sort de la même classe.

Exercice 2 : Digramme bidirectionnel

Ecrivez une classe BiStemPlot similaire à la classe StemPlot mais qui modélise un diagramme à tige et à feuille bidirectionnel, permettant d'afficher (et de comparer) deux ensembles de valeurs.

Par exemple, admettons que les hauteurs des jeunes sportifs soit celles de 8 filles de hauteurs { 152, 152, 160, 161, 163, 173, 175, 175 } et 6 garçons de hauteurs { 154, 161, 162, 163, 173, 178 }. On peut représenter ces deux ensembles de données au moyen du diagramme bidirectionnel suivant, les filles étant à gauche et les garçons à droite :

 22|15|4
310|16|123
553|17|38

Une fois la classe StemAndLeafBiPlot terminée, modifiez la classe Main afin qu'elle affiche un tel diagramme bidirectionnel avec les résultats des deux sections, obtenus des fichiers data_IN.txt et data_SC.txt.

Conseil : la méthode format de String permet de spécifier la longueur minimale que doit occuper une chaîne de caractères, ce qui permet de facilement en aligner plusieurs. Par exemple, les appels suivants :

System.out.println(String.format("<%20s>", "Bonjour,"));
System.out.println(String.format("<%20s>", "comment"));
System.out.println(String.format("<%20s>", "allez"));
System.out.println(String.format("<%20s>", "vous ?"));

affichent les différentes chaînes avec une longueur de 20 caractères, en les alignant à droite au moyen d'espaces si nécessaire. L'affichage obtenu est donc :

<            Bonjour,>
<             comment>
<               allez>
<              vous ?>