Bargraphes similaires au site officiel

Comme indiqué dans le titre, cette page est destinée à montrer comment réaliser facilement des bargraphes qui ont le même aspect que sur le site officiel.

Plus précisément, une fois la page du site officiel téléchargée et partiellement visible dans la fenêtre du navigateur web, il faut cliquer sur "Couverture vaccinale par classe d’âge" pour faire apparaître une série de bargraphes qui va mettre sur certains ordinateurs largement plus de 10 secondes à s'afficher.

Le but de cette page est de montrer comment réaliser la même chose en une fraction de secondes en utilisant les possibilités du langage HTML.

Pour réaliser ces bargraphes, 6 images ont été préparées et enregistrées dans le sous-répertoire img-ref. Il s'agit d'images BMP rectangulaires de 500x50 pixels et de couleur unie. Au début, les couleurs pour la première et la deuxième dose de vaccin reprenaient celles du site officiel. Comme ce site n'indique rien pour les doses supplémentaires, une troisième et une quatrième couleur ont été choisies en fonction des deux autres. Puis, comme avec la 5ème dose l'étagement des couleurs était de plus en plus mauvais, il a été refait en prévoyant à l'avance une 6ème dose.

Affichées telle quelles, ces 6 images donnent ceci :

 
 
 
 
 


Pour l'instant, on n'exploite que les 5 premières couleurs.

On va utiliser la possibilité de modifier la proportion largeur/hauteur d'une image pour afficher les bargraphes.

On utilise le modèle de fichier HTML bargraphe-age1.html dont la partie droite de la page contient le code suivant :
  <div id="contenu">
      <h1>Vaccination COVID 19 en France<br>
          par classes d'âge au XXXDATE</h1>
      <br>
      <table border="0" align="center">
          <tr>
              <td width="120px">Légende :</td>
              <td bgcolor="#B0E0FF" width="20px">&nbsp;</td>
              <td width="100px">1<sup>ère</sup> dose</td>
              <td bgcolor="#40A0FF" width="20px">&nbsp;</td>
              <td width="100px">2<sup>ème</sup> dose</td>
              <td bgcolor="#0060FF" width="20px">&nbsp;</td>
              <td width="100px">3<sup>ème</sup> dose</td>
              <td bgcolor="#0040C0" width="20px">&nbsp;</td>
              <td width="100px">4<sup>ème</sup> dose</td>
              <td bgcolor="#002080" width="20px">&nbsp;</td>
              <td>5<sup>ème</sup> dose</td>
          </tr>
      </table>
      <br>
      <br>
      <table border="0" align="center" style="font-size:150%">
          XXXLISTE
      </table>
      
En l'absence de traitement, ce modèle de fichier HTML donne le résultat suivant :



On remarque que la liste des bargraphes apparaîtra dans une table alignée au centre de la zone d'affichage principale de la page web.

Cette manière de procéder permettra à la fois d'avoir les bargraphes relativement centrés dans la partie droite de la page, tout en gardant ces bargraphes de longueur différentes alignés entre eux du coté gauche.

Le script PHP bargraphe-age1.php va devoir mettre la date de l'état de vaccination à la place de XXXDATE puis générer une liste de bargraphes correspondant aux différentes classes d'âge à la place de la ligne contenant XXXLISTE

On commence par actualiser lorsque c'est nécessaire le fichier csv local vacsi-tot-a-fra.csv avant de l'ouvrir en lecture.
    // vérifier si le fichier csv à utiliser est à jour
    // l'actualiser si nécessaire
    testmaj_tot_a_fra ();

    // l'ouvrir en lecture
    $ficcsv = DIR_CSV."/vacsi-tot-a-fra.csv";
    $descscv = fopen ($ficcsv, "r");
      
Ensuite, si l'ouverture du fichier s'est bien passée, on récupère et on affiche la date présente au début de ce fichier après l'avoir mise au format jj/mm/aaaa
    // lire la date mémorisée (format aaaa/mm/jj)
    $datefic = trim (fgets ($descscv, 20));

    // la retourner au format jj/mm/aaaa
    $datefic = substr ($datefic, 8, 2)."/".substr ($datefic, 5, 2)."/".substr ($datefic, 0, 4);

    // recopier le début de fichier html en mettant la date dans le titre
    copmaj ($descfic, "XXXDATE", $datefic);
      
On recopie la suite du fichier HTML jusqu'à l'endroit où on peut rentrer les différents bargraphes et on saute les classe d'âge jusqu'à 4 ans (11 ans à la mise en ligne du site en octobre 2021) pour lesquelles le taux de vaccination est infime.
    // recopier le fichier html jusqu'à la liste
    copie_jusque_chaine ($descfic, "XXXLISTE");

    // sauter les classes d'âge jusqu'à 4 ans
    do
    {
        // lire une ligne du fichier csv local
        $ligne = trim (fgets ($descscv, LG_MAX_CSV));

        // récupérer l'âge maximum sans 0 à gauche du chiffre
        $agemax = (substr ($ligne, 0, 2) + 0);
    }
    while ($ligne && $agemax < 4);
      
On récupère le nombre de doses de vaccin mémorisées dans le fichier csv local.
    // trouver le nombre de doses mémorisées
    $args = explode (";", $ligne, 20);
    $nb_doses = (count ($args) - 2) / 2;
      
On va alors traiter les autres classes d'âge. Chaque classe d'âge commence un an après l'âge limite de la classe d'âge précédente.

Après avoir lue la ligne du fichier vacsi-tot-a-fra.csv correspondant à une nouvelle classe d'âge, on en extrait les différents champs (appel de la fonction explode (...)), puis on génère le texte correspondant à la classe d'âge concernée comme on l'avait fait dans le fichier table-age.php

On va alors générer 3 bargraphes correspondant aux différentes doses de vaccin, puis on recommence avec la classe d'âge suivante jusqu'à ce qu'on ait traité celle qui concerne les personnes "à partir de 80 ans".
    // répéter
    do
    {
        // âge de début de la prochaine classe d'âge
        $agemin = $agemax + 1;

        // lire une ligne du fichier csv local
        $ligne = trim (fgets ($descscv, LG_MAX_CSV));

        // récupérer les différents champs de la ligne
        $args = explode (";", $ligne, 8);

        // extraire l'âge maximum
        $agemax = $args [0];

        // générer la tranche d'âge
        if ($agemin < 80)
            $ages = "De ".$agemin." à ".$agemax." ans";
        else
            $ages = "À partir de ".$agemin." ans";

        (....)
    }
    // jusqu'à ce que toutes les classes d'âge soient traitées
    while ($ligne && $agemax < 80);
      
La présentation des taux de vaccination pour une classe d'âge commence par l'affichage d'un titre indiquant de quelle classe d'âge il s'agit.

Ensuite, on va afficher les bargraphes correspondant aux taux de vaccination pour les différentes doses. Une boucle va réaliser autant de fois qu'il y a de doses, le même type de traitement avec des paramètres différents.

Les différents taux de vaccination figurent dans les argument 5, 6 et 7 de chaque ligne du fichier csv local.

Pour chaque dose du vaccin, on va afficher une image rectangulaire de la couleur indiquée dans la légende pour cette dose de vaccin.

On utilise la possibilité offerte par le langage HTML et les navigateurs web de redimensionner les images, y compris en modifiant la proportion largeur/hauteur.

La largeur d'affichage choisie est de 500 pixels pour un taux de vaccination de 100 % (soit une résolution d-affichage de 0,2 % par pixel).

Avant d'afficher le bargraphe, on calcule le nombre de pixels que l'image devra avoir en largeur. Mais on doit préciser également une hauteur fixe (40 pixels) pour cette image, sinon, largeur et hauteur seront modifiées dans les même proportions.

A droite de l'image, on affiche le pourcentage correspondant. On peut remarquer que des balises <sup>...</sup> encadrent le pourcentage indiqué. Si on ne le fait pas, ces pourcentages sont affichés plus bas et donc mal centrés par rapport à l'image.

Cependant l'emploi de ces balises a comme effet secondaire d'afficher les pourcentages en caractères plus petits. Pour y remédier, une taille de caractères de 150 % a été déclarée dans le modèle de fichier HTML pour la table qu'on est en train de remplir.
    <table border="0" align="center" style="font-size:150%">
        XXXLISTE
    </table>
Et comme il est souhaitable que les titres qui mentionnent les classes d'âge soient plus gros, il n'y a pas besoin de modifier une autre fois la fonte utilisée pour leur affichage.

Voici le code PHP de la partie permettant de générer les bargraphes.
    // ligne de titre
    echo '          <tr><td align="center">'.$ages."</td></tr>\n";

    // génération des deux bargraphes
    for ($dose = 1; $dose <= $nb_doses; $dose++)
    {
        // les taux sont dans les éléments 5 à 7 de $args
        $numarg = $nb_doses + 1 + $dose;

        // franciser le taux
        $taux = str_replace (".", ",", $args [$numarg])." %";

        // et calculer la largeur en pixels nécessaire pour le bargraphe
        $largeur = round ($args [$numarg] * 5);

        // générer la ligne html avec un bargraphe et le taux indiqué
        echo '          <tr><td><img src="'.DIR_IMG_REF."/barre_dose".$dose.'.bmp" ';
        echo 'height="40px" width="'.$largeur.'px"> &nbsp;';
        echo "<sup>".$taux."</sup></td></tr>\n";
    }

    // séparation entre 2 classes d'âge
    echo "          <tr><td><br></td></tr>\n";
      
Exemple de code généré le 29 novembre 2021 avec seulement 3 doses de vaccin :
    <tr><td align="center">À partir de 80 ans</td></tr>
    <tr><td><img src="img-ref/barre_dose1.bmp" height="40px" width="436px"> &nbsp;<sup>87,1 %</sup></td></tr>
    <tr><td><img src="img-ref/barre_dose2.bmp" height="40px" width="427px"> &nbsp;<sup>85,3 %</sup></td></tr>
    <tr><td><img src="img-ref/barre_dose3.bmp" height="40px" width="232px"> &nbsp;<sup>46,3 %</sup></td></tr>
    <tr><td><br></td></tr>
      
Et le résultat visuel :