Bargraphes de plusieurs couleurs

Principe général

Les 4 séries de bargraphes du menu autres que celle décrite précédemment :
sont générées selon le même principe.

Tout d'abord, comme pour la présentation des données sous forme de tableaux, il est nécessaire de mettre à jour périodiquement le fichier csv local à partir du fichier csv de référence. Pour cela, on fait appel à la même fonction testmaj-tot.... ()

Les données étant présentées sous la forme de bargraphes (qui sont des images au format BMP), ces bargraphes devront être mis à jour chaque fois que le fichier csv local qui a permit de les générer est actualisé.

Ce tableau indique pour chaque série de bargraphes quels fichiers sont utilisés.

Critère de triFichier csv local Fonction de mise à jourNom des bargraphes
Général vacsi-totgen-fra.csv testmaj_totgen_fra () barre-gen-??.bmp
Par classe d'âge vacsi-tot-a-fra.csv testmaj_tot_a_fra () barre-age-??.bmp
Par région vacsi-tot-reg.csv testmaj_tot_reg () barre-reg-???.bmp
Par DOM vacsi-tot-dom.csv Voir explication barre-dom-???.bmp

Comme dans le cas de la présentation des données sous forme de tables, le fichier vacsi-totgen-fra.csv utilise le fichier csv local vacsi-tot-a-fra.csv pour être réactualisé. En conséquence, la fonction testmaj_tot_a_fra () est appelée avant testmaj_totgen_fra () .

Si ces données redeviennent disponibles, une fonction testmaj_tot_dom () sera rajoutée.

Chaque page web affichant plusieurs bargraphes, il faut plusieurs images bmp dont chacune a un nom différent. C'est au niveau des ? que diffèrent les noms des différents bargraphes d'une catégorie.

À la place de ces ? on trouve :
Les différents bargraphes dont on aura besoin sont générés par un programme C appelé depuis le script php.

Le modèle de fichier html

Pour les 4 séries de bargraphes, le modèle de page html utilisé est similaire.

Voici le partie <body> de celui qui permet d'afficher les bargraphes par région.
<body>
  <div id="contenu" align="center">
      <h1>Vaccination COVID 19 en France<br>
          par région au XXXDATE</h1>
      XXXLISTE
      <br>
  </div>

  <div id="menu">
      XXXMENU
  </div>
</body>
      
On peut remarquer que le contenu de la partie droite de la page web est centré.
      <div id="contenu" align="center">
Comme les bargraphes ont tous la même largeur, il n'est pas nécessaire de recourir à une table pour les aligner d'un coté, comme c'est le cas pour les bargraphes "Par classe d'âge (1)".

Le script PHP va devoir mettre la date de l'état de vaccination à la place de XXXDATE puis générer une série de bargraphes à la place de la ligne contenant XXXLISTE .

Le script php qui génère la page

Le début du traitement effectué par ce script est le même que pour l'affichage des données sous la forme d'une table.
Dans le cas du script qui affiche les bargraphes relatifs à la vaccination par région, on commence par le code suivant :
    // modèle de page html
    $ficpage = DIR_PAGES."/bargraphe-reg.html";

    // ouvrir le fichier contenant la page à afficher
    $descfic = fopen ($ficpage, "r");

    // si l'ouverture s'est bien passée
    if ($descfic)
    {
        // recopier le début de l'entête html en remplaçant noindex par index
        copmaj ($descfic, "noindex,", "index,");

        // recopier le début du fichier html jusqu'à la zone contenu
        copie_jusque_chaine ($descfic, "contenu", 1);

        // vérifier si le fichier csv à utiliser est à jour
        // l'actualiser si nécessaire
        testmaj_tot_reg ();
      
Si le fichier csv local a été mis à jour, il faut le faire aussi pour tous les bargraphes. Pour cela, on compare la date de mise à jour de l'un des bargraphes concernés (dans l'exemple ci dessous, le bargraphe pour la région Occitanie) avec celle du fichier csv local.

Si le fichier csv local est plus récent, on utilise la commande exec du PHP pour lancer l'exécution du programme C gen-serie-bargraphes auquel on passe comme paramètre le nom du fichier csv local et le début du nom des images bmp à générer.

Si l'exécution du programme C se passe mal, un affichage d'erreur est prévu.
    // chemin d'accès au fichier csv
    $ficcsv = DIR_CSV."/vacsi-tot-reg.csv";

    // si les bargraphes sont trop anciens (ou inexistants)
    if (filemtime (DIR_IMAGES."/barre-reg-occ.bmp") < filemtime ($ficcsv))
        // les construire ou les actualiser
        exec ("bin/gen-serie-bargraphes ".$ficcsv." barre-reg 2>&1", $erreur);

    // si erreur pour fabriquer les images
    if (count ($erreur))
        // l'afficher
        echo '        <font color = "#FF0000">'.$erreur [0]."</font><br>\n";
      
Ensuite, on accède au fichier csv local, on récupère la date dans sa première ligne, on la met au format jj/mm/aaaa, on l'affiche au bon endroit et on recopie la suite du fichier HTML jusqu'à la ligne où on rajoutera les différents bargraphes.
    // ouvrir en lecture le fichier csv
    $descscv = fopen ($ficcsv, "r");

    // si l'ouverture s'est bien passée
    if ($descscv)
    {
        // lire la date mémorisée (format aaaa/mm/jj)
        $datefic = trim (fgets ($descscv, 20));

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

        // recopier le début du fichier html en mettant la date dans le titre
        copmaj ($descfic, "XXXDATE", $datefic);

        // recopier le fichier html jusqu'à la liste
        copie_jusque_chaine ($descfic, "XXXLISTE");
      
On est prêt pour traiter les lignes du fichier csv local qui suivent.

Comme on le fait pour générer les bargraphes similaires au site officiel, on commence par lire la première ligne du fichier csv et en extraire le nombre de doses de vaccin :
    // lire la ligne de la première région
    $ligne = trim (fgets ($descscv, LG_MAX_CSV));

    // trouver le nombre de doses mémorisées
    $args = explode (";", $ligne, 20);
    $nb_doses = (count ($args) - 2) / 2;
      
Puis pour chacune des lignes du fichier csv local, on va :
Pour le titre du bargraphe, dans le cas des régions ou des DOM, c'est directement le champ 0 de la ligne lue. Dans le cas des bargraphes par classe d'âge ou à partir d'un certain âge, il y a une petite transformation à faire qui similaire à celle réalisée pour la colonne 1 des tableaux (voir 2 lignes plus haut dans le menu de gauche).

Pour les taux de vaccination, on remplacera les points décimaux par des virgules et on ajoutera % après la valeur numérique.
    // tant que non fin de fichier
    while ($ligne)
    {
        // récupérer les différents champs de la ligne
        $args = explode (";", $ligne, 20);
        echo "      <h2>".$args [0]."</h2>\n      ";

        // pour chaque dose de vaccin
        for ($dose = 1; $dose <= $nb_doses; $dose++)
        {
            // mettre en forme le taux de vaccination
            $taux = str_replace (".", ",", $args [$nb_doses + 1 + $dose])." %";

            // l'afficher
            echo "Dose ".$dose." : ".$taux." &nbsp; &nbsp; ";
        }

        // calculer le taux de non vaccinés
        $nonvacc = str_replace (".", ",", 100 - $args [$nb_doses + 2]);

        // l'afficher aussi
        echo "Non vacciné : ".$nonvacc." %<br><br>\n";
      
Il ne reste plus qu'à afficher le bon bargraphe. Le cas des bargraphes généraux et des bargraphes par classe d'âge est le plus simple : le champ $args [0] contient directement le code de 2 chiffres qui apparaît dans le nom de l'image bmp à afficher.

Pour les bargraphes par région, la partie variable de leur nom est constituée pas les 3 premières lettres du nom de la région écrites en minuscules :
    // récupérer le code de la région utilisé pour le fichier bmp
    $code = substr (strtolower ($args [0]), 0, 3);
      
C'est pour les DOM que c'est le plus compliqué.
    // récupération du code du DOM utilisé pour le fichier bmp
    $regdom = strtolower ($args [0]);

    // si le nom commence par "st"
    if (substr ($regdom, 0, 2) == "st")
        // on prend les caractères 1, 4 et 5 du nom
        $code = substr ($regdom, 0, 1).substr ($regdom, 3, 2);
    // sinon
    else
        // on prend les 3 premiers caractères en remplaçant les é par e
        $code = substr (str_replace ("é", "e", $regdom), 0, 3);
      
On est en mesure d'afficher le bargraphe. Le code qui suit est celui pour les bargraphes concernant une région.
    // afficher le bargraphe en 5 couleurs
    echo '      <img src="'.DIR_IMAGES."/barre-reg-".$code.".bmp\"><br>\n";
      
On peut passer à la ligne suivante du fichier csv local et recommencer le même traitement jusqu'à ce que ce fichier ait été traité en entier.

Il ne reste plus alors qu'à terminer le fichier HTML en rajoutant le menu qui doit apparaître du coté gauche. Ce traitement est réalisé à l'identique pour toutes les pages du site qui donnent des statistiques de vaccination.
    // copie la suite du fichier html jusqu'à la section du menu
    copie_jusque_chaine ($descfic, "XXXMENU");

    // générer le menu
    genmenu ("menu-vaccin", basename ($_SERVER ['SCRIPT_NAME']));

    // copier la fin de la page html
    copie_jusque_fin ($descfic);

    // terminé avec le fichier html
    fclose ($descfic);
      

Le programme C pour générer les bargraphes

Ce point est détaillé ici.