arrow-left

Cette page uniquementToutes les pages
gitbookPropulsé par GitBook
1 sur 14

SAE 303 - Dataviz

Loading...

Loading...

Loading...

Loading...

Cours de David Annebicque

Loading...

Loading...

Cours d'Olivier Chérain

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Choix du sujet

Cette année ce module se fait en lien avec "ODU - Open Data University" de l'association Latitudesarrow-up-right.

Les sources de données et des éléments de contexte sont sur ce site : https://www.opendatauniversity.org/arrow-up-right

circle-info

Vous pouvez compléter ces données par d'autres sources (en les citant) si nécessaire.

hashtag
Objectifs de la SAE

  • Choisir une source de données parmi celles disponibles

  • Imaginer une analyse des données et le message auquel répondre

  • Proposer un site web qui sera composé des élements suivants (obligatoires) :

triangle-exclamation

Il y a suffisamment de sources et de manière d'interpréter les données ou de questions à poser que touts vos productions devront être différentes.

hashtag
Quelques exemples

Site web accessible, éco-conçu (pas de CMS)
  • Une infographie réalisée avec le logiciel de votre choix

  • Des graphiques développés par vos soins

    • Avec des interactions

  • Des graphiques issus d'outils en ligne

  • Une mise en page (travaillée et adaptée) et des textes explicatifs

  • Une ergonomie et une mise en page agréable, appuyant votre message.

  • https://business.trustedshops.fr/blog/dataviz-pour-votre-e-commercearrow-up-right
    https://inkidata.fr/actu-infographies-de-synthese-datavisualisation-resultats/arrow-up-right

    Analyser les données - statistiques


    file-download
    13KB
    exercice 1 stats.xlsx
    arrow-up-right-from-squareOuvrir
    file-download
    137KB
    exercice2 stats.xlsx
    arrow-up-right-from-squareOuvrir
    file-download
    25KB
    exercice 1 stats correction.xlsx
    arrow-up-right-from-squareOuvrir
    file-download
    70KB
    exercice 2 correction.xlsx
    arrow-up-right-from-squareOuvrir

    Analyser les données - TCD

    file-download
    14KB
    exercice 1 tcd.xlsx
    arrow-up-right-from-squareOuvrir
    file-download
    36KB
    exercice 2 tcd.xlsx
    arrow-up-right-from-squareOuvrir


    file-download
    32KB
    exercice 1 tcd correction.xlsx
    arrow-up-right-from-squareOuvrir

    file-download
    125KB
    exercice 2 tcd correction.xlsx
    arrow-up-right-from-squareOuvrir

    Exercice datavisualisation 2

    Département de l'Aube : scolarisation selon l'âge et le sexe en 2020

    Exercice datavisualisation 1

    Ventes de produits de la société MMI - 2022 - en quantités

    TD 1 - Tips

    Lundi 23/10, 14h00 ou mardi 24/10, 8h00

    hashtag
    Tips

    hashtag
    Paramètres l'axe Y

    hashtag
    Deux axes

    hashtag
    Choix des données

    Le HTML

    Le JS

    hashtag
    Afficher une carte

    Avec d3js : Installer D3js :

    Le fichier html/JS

    Il faut récupérer un fichier geoJson ici :

    Et le charger à la place de departements.json

    Un autre exemple de carte avec des couleurs :

    • Il faut ici une source CSV pour avoir les données de population.

    Ou encore un autre exemple ici :

    const myChart = new Chart(
      document.getElementById('myChart'),
      {
        type: 'line',
        data: {
          labels: ['1', '2', '3', '4', '5'],
          datasets: [{
            label: 'A',
            data: [100, 96, 84, 76, 69],
            fill: true,
          }]
        },
        options: {
          scales: {
            y: {
              min: 0,
              max: 100
            }
          }
        }
      }
    );
    https://www.datavis.fr/d3js/firststeparrow-up-right
    https://github.com/gregoiredavid/france-geojsonarrow-up-right
    https://www.datavis.fr/d3js/map-populationarrow-up-right
    https://www.datavis.fr/d3js/map-improvearrow-up-right
    const myChart = new Chart(
      document.getElementById('myChart'),
      {
        type: 'line',
        data: {
          labels: ['1', '2', '3', '4', '5'],
          datasets: [{
            label: 'A',
            yAxisID: 'A',
            data: [100, 96, 84, 76, 69],
            fill: true,
          }, {
            label: 'B',
            yAxisID: 'B',
            backgroundColor: 'rgb(122, 99, 255)',
            borderColor: 'rgba(102, 99, 255, 0.2)',
            data: [1, 1, 0.5, 1, 0],
            fill: false,
          }]
        },
        options: {
          scales: {
            A: {
              type: 'linear',
              position: 'left',
            },
            B: {
              type: 'linear',
              position: 'right',
              ticks: {
                max: 1,
                min: 0
              }
            }
          }
        }
      }
    );
    <!DOCTYPE html>
    <html lang="fr">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <script src="https://cdn.jsdelivr.net/npm/chart.js" defer></script>
        <script src="assets/js/demo3.js" defer></script>
    </head>
    <body>
        <canvas id="graph"></canvas>
        <div>
            <input type="checkbox" id="check1" value="A" data-color="rgb(120,123,21)" data-label="A" data-value="[1, 3, 4, 6]">A
            <input type="checkbox" id="check1" value="B" data-color="rgb(21,123,121)" data-label="B" data-value="[4, 2, 41, 12]">B
            <input type="checkbox" id="check1" value="C" data-color="rgb(20,13,21)" data-label="C" data-value="[2, 0, 9, 6]">C
            <input type="checkbox" id="check1" value="D" data-color="rgb(120,13,21)" data-label="D" data-value="[10, 3, 7, 1]">D
        </div>
    </body>
    </html>
    const myChart = new Chart(
        document.getElementById('graph'),
        {
            type: 'line',
            data: {
                labels: ['1', '2', '3', '4'],
                datasets: []
            },
        }
    );
    
    document.querySelectorAll('input[type=checkbox]').forEach((e) => {
        e.addEventListener('click', (el) => {
            console.log('check')
            if (el.target.checked) {
                val = el.currentTarget.dataset.value.substring(1, el.currentTarget.dataset.value.length - 1).split(', ');
                obj = {
                    label: el.currentTarget.dataset.label,
                    data: val,
                    fill: false,
                    backgroundColor: el.currentTarget.dataset.color,
                    borderColor: el.currentTarget.dataset.color,
                }
                myChart.data.datasets.push(obj);
                myChart.update()
            } else {
                myChart.data.datasets = myChart.data.datasets.filter((e) => e.label !== el.currentTarget.dataset.label)
                myChart.update()
            }
        })
    })
    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <script src="https://d3js.org/d3.v7.min.js"></script>
        <style>
            .map-tooltip {
                position: absolute;
                text-align: center;
                z-index: 1000;
                color: black;
                width: 275px;
                height: 37px;
                padding: 2px;
                font: 12px sans-serif;
                background: grey;
                border: 0px;
                border-radius: 8px;
                pointer-events: none;
            }
        </style>
    </head>
    
    <body>
        <div id="map"></div>
    
        <script>
            const width = 550, height = 550;
            const path = d3.geoPath();
            const projection = d3.geoConicConformal()
                .center([2.454071, 46.279229])
                .scale(2600)
                .translate([width / 2, height / 2]);
            path.projection(projection);
    
            const svg = d3.select('#map').append("svg")
                .attr("id", "svg")
                .attr("width", width)
                .attr("height", height);
    
            const deps = svg.append("g");
    
            d3.json('assets/js/departments.json').then(function (geojson) {
                deps.selectAll("path")
                    .data(geojson.features)
                    .enter()
                    .append("path")
                    .attr('class', 'department')
                    .attr("d", path)//récupère chaque path (chaque département), possible de changer la couleur de path avec un attribut sur le SVG
                    .on("mouseover", function (event, d) {
                        console.log(d)//d contient les informations du département survolé
                        div.transition()
                            .duration(200)
                            .style("opacity", .9);
                        div.html("Département : " + d.properties.NOM_DEPT + "<br/>"
                            + "Région : " + d.properties.NOM_REGION)
                            .style("left", (event.pageX + 30) + "px")
                            .style("top", (event.pageY - 30) + "px")
                    })
                    .on("mouseout", function (event, d) {
                        div.style("opacity", 0);
                        div.html("")
                            .style("left", "-500px")
                            .style("top", "-500px");
                    });
            });
    
            let div = d3.select("body").append("div")
                .attr("class", "map-tooltip")
                .style("opacity", 0);
        </script>
    </body>
    
    </html>

    Introduction

    Les données sont de plus en plus présentes dans le monde de l’entreprise ou des services. Elles permettent d’enrichir une information, mais servent aussi d’outil de communication.

    A partir de jeux de données, cette SAE mobilise les ressources liées à l’analyse de données, à la production graphique, à l’intégration et au développement front et amène les étudiants à :

    • Analyser des données pour en extraire des indicateurs ou les informations pertinentes ;

    • Proposer un site web permettant la visualisation de ces données

    • Compléter ce site web par la production d'une application interactive permettant une navigation au sein des données.

    Les étudiants réalisent les contenus et les présentent au commanditaire en répondant à la question : comment concevoir des visualisations de données apportant une information pertinente et appuyant une communication ?

    TD 1 - Premiers graphiques

    hashtag
    Retour sur les maquettes

    • N'hésitez pas à ajouter de la couleur, faire un travail sur le choix des polices, travail sur les typographies, ...

    • Des mises en avant de chiffres, de phrases, ... (animées ou non), peuvent être pertinentes pour casser une routine de lecture sur les pages.

    • Des photos et illustrations peuvent être utilisées

    • Une icônographie peut être utilisée

    hashtag
    Questions/réponses

    • Pas de responsive imposé

    • Librairies CSS autorisées

    • Icône, images existantes autorisées

    hashtag
    Création de graphiques en JavaScript

    Pour générer des graphiques sur le web il existe plusieurs solutions

    • Méthodes statiques

      • L'image et le graphique sont construits avec un logiciel de création graphique classique, ou excel, ou équivalent. L'image est enregistrée et on la dépose sur le serveur web pour l'afficher comme une image classique.

    • Méthodes "dynamique"

    circle-info

    d3js () est la librairie la plus complète, mais aussi un peu plus difficile à mettre en place.

    hashtag
    Librairies JS

    Pour ce premier exemple on va utiliser (mais toutes les autres fonctionnent sur une logique similaire).

    ChartJs, va générer du Canvas qui est intégré directement dans votre page HTML à partir d'une source de données JavaScript.

    hashtag
    Mise en place

    hashtag
    Partie HTML

    Intégration du graphique dans votre page HTML

    Il faut définir un objet "canvas" avec un id, dans lequel le graphique sera inséré. Vous pouvez ajouter autant de zone de graphique que vous le souhaitez.

    Il faut ensuite ajouter la dépendance à ChartJs

    Soit en CDN (comme ci-dessus) ou en intégrant les fichiers que vous auriez téléchargé.

    hashtag
    Partie JavaScript

    Soit directement dans le fichier HTML, soit en incluant un fichier js.

    Le code ci-dessus permet de construire un objet Chart, avec deux paramètres :

    • L'id (lien avec le canva) où sera mis en place le graphique

    • Un objet JSON qui contient la construction du graphique.

    Cette seconde partie de code va permettre de définir les éléments du graphique.

    • Le type (line, pie, plot, ...)

    • Les "data" (la forme de cette partie peut varier selon le type de graphique)

    Les "data" sont souvent composées d'un nom (label), de données (data), et souvent de paramètres de couleurs ou d'option. Consulter la documentation pour chaque type de graphique.

    hashtag
    Exercice

    • Mettre en place votre premier graphique avec ChartJS (ou une librairie de votre choix)

    hashtag
    Gestion des données

    Comme vous le constatez les données sont inscrites directement dans la configuration. Ce qui peut être bien, mais n'est pas forcément optimal si les données doivent changer régulièrement.

    Elles peuvent donc provenir d'un fichier JSON qui serait récupéré depuis une API par exemple, ou d'un appel API directement, ...

    Ci-dessous un exemple se basant sur un fichier JSON.

    hashtag
    Import d'un fichier JSON

    Soit si c'est un fichier JavaScript importé

    hashtag
    Modification

    Le code du graphique doit donc manipuler les données du fichier Json

    Exemple de fichier JSON

    Exemple d'utilisation dans le javascript

    hashtag
    Ajouter des données

    Il est possible d'ajouter ou de retirer des données en lien avec un graphique existant.

    Exemple de code javascript, à associer sur un bouton avec un id "bouton", et un chart nommé charteGenreMMI2. Les données sont fixées par le code ici, elles peuvent venir de sources, de formulaires, ...

    Documentation associée :

    On peut générer en back en créant une image, à partir de données en PHP (avec la librairie GD ou d'autres ( par exemple), et l'afficher comme une image. Cette solution est intéressante, mais ne permet pas forcément une grande interactivité avec le graphique produit

  • Le générer avec un langage front, comme JavaScript. Dans ce cas il existe de nombreuses librairies (une liste non exhaustive ici : ). Cette solution permet une grande interactivité avec les données et le résultat produit.

  • https://observablehq.com/@d3/galleryarrow-up-right
    Chart.jsarrow-up-right
    https://www.chartjs.org/docs/latest/developers/updates.htmlarrow-up-right
    // Some code
    <div>
      <canvas id="myChart"></canvas>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
    <script>
      const myChart = new Chart(
        document.getElementById('myChart'),
        {
        type: 'line',
        data: {
          labels: [
            'January',
            'February',
            'March',
            'April',
            'May',
            'June',
          ],
          datasets: [{
            label: 'My First dataset',
            backgroundColor: 'rgb(255, 99, 132)',
            borderColor: 'rgb(255, 99, 132)',
            data: [0, 10, 5, 2, 20, 30, 45],
          }]
        },
        options: {}
      }
      );
    </script>
    fetch('./data.json')
                .then(response => response.json())
                .then(dataJson => {
                
                })
    .catch(error => console.error('Erreur lors du chargement des données JSON:', error));
    <script src="assets/js/graphiques.js" defer type="module"></script>
    {
        "mmi1": {
            "h":73,
            "f": 44
        },
        "mmi2": {
           "crea": {
                "h": 17,
                "f": 13
            },
            "comm": {
                "h": 11,
                "f": 4
            },
            "devFi": {
                "h": 18,
                "f": 7
            },
            "devFc": {
                "h": 74,
                "f": 28
            }
        }
    }
    fetch('./data.json')
                .then(response => response.json())
                .then(dataJson => {
    
            const chartGenreComm = new Chart(
                document.getElementById('chartGenreComm'),
                {
                    type: 'pie',
                    data: {
                        labels: [
                            'Homme',
                            'Femme'
                        ],
                        datasets: [{
                            label: 'Répartition des genres Parcours Communication',
                            backgroundColor: [
                                'rgb(255, 99, 132)',
                                'rgb(54, 162, 235)',
                            ],
                            hoverOffset: 4,
                            data: [dataJson.mmi2.comm.h, dataJson.mmi2.comm.f],
                        }]
                    },
                    options: {
                        plugins: {
                            title: {
                                text: 'Répartition des genres Parcours Communication',
                                display: true
                            }
                        }
                    }
                }
            );
            })
            .catch(error => console.error('Erreur lors du chargement des données JSON:', error));
    const charte2 = new Chart(
                document.getElementById('charte2'),
                {
                    type: 'bar',
                    data: {
                        labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],
                        datasets: [{
                            label: '# of Votes',
                            data: [12, 19, 3, 5, 2, 3],
                            borderWidth: 1
                        }]
                    },
                    options: {
                        scales: {
                            y: {
                                beginAtZero: true
                            }
                        }
                    }
                }
            );
    
            //un clic sur le bouton avec l'id bouton doit ajouter un élément au charte2
            document.getElementById('bouton').addEventListener('click', () => {
                charte2.data.labels.push('New');
                charte2.data.datasets[0].data.push(10);
                charte2.update();
            });
    http://www.pchart.net/arrow-up-right
    https://geekflare.com/fr/charting-libraries/arrow-up-right
    Quelles data visualisations choisir ? Dashboards, datastories, mapsHuwisechevron-right
    Dataviz intéractives
    Logo

    Cours magistral 1 - Donner du sens aux données

    file-pdf
    3MB
    SAE303 - CM1.pdf
    PDF
    arrow-up-right-from-squareOuvrir

    Organisation et Livrable

    hashtag
    Organisation

    • En binôme

    • Présent à l'IUT sur tous les créneaux "PTUT"

    hashtag
    Livrables

    hashtag
    Intermédiaires

    • Vendredi 27 septembre, 12h30 (a communiquer à l'IUT entre 11h et 12h30, salle h103)

      • Votre binôme

      • Votre source de données

    circle-exclamation

    Attention ! L'interactivité ici est à lire au sens : Graphiques paramétrables (cocher/masquer des informations, ...). Les comportements natifs des outils ne sont pas considérés comme des interactivités programmés.

    circle-info

    hashtag
    CHANGEMENT DE DATE DE RENDU !!! Site web avec data-visualisations interactives à rendre pour le 17 octobre 2024 18 octobre 2024, 12h30.

    Le rendu se fera par mail (1 par binôme).

    hashtag
    Critères de notation

    • Site web

      • Accessibilité (a11y AA)

      • Eco-conception

    hashtag
    Quelques exemple (bons et moins bons)

    Votre "histoire" (les données sont larges pour que les histoires ne soient pas toutes identiques).
  • Mercredi 2 octobre, à partir de 15h30 (H017) Jeudi 3 octobre 11h, h101

    • Présentation d'une maquette détaillée des pages proposées

      • Avec tous les éléments présents sur la mise en page

    • Choix des graphiques (même si les données ne sont pas encore finalisées)

  • 15 octobre, à partir de 14h00 (et avant 15h30)

    • Une pré-version du site en ligne

    • Votre site contiendra au moins deux pages (ou en one page) pour les dataviz + une page avec vos coordonnées + une page avec les références et sources utilisées

      • S'il faut chiffrer entre 8 et 10 graphiques semblent pertinents

        • Au moins 4 programmés, dont au moins deux fortement interactif

        • 1 en infographie libre

  • 17 octobre 17h00 18 octobre 12h30 (rendu final en ligne)

  • Données exploitées
  • Histoire racontée

  • Esthétique du site (qualité de l'infographie libre, du site globalement)

  • Les autres au format libre

    Cours magistral 2 - préparer les données

    file-pdf
    2MB
    SAE303 - CM2.pdf
    PDF
    arrow-up-right-from-squareOuvrir

    CM Introductif

    file-pdf
    3MB
    SAE303 - CM1.pdf
    PDF
    arrow-up-right-from-squareOuvrir
    Introduction
    https://mmi22a13.mmi-troyes.fr/sae303/mmi22a13.mmi-troyes.frchevron-right
    http://mmi22d15.mmi-troyes.fr/sae303d/mmi22d15.mmi-troyes.frchevron-right
    http://clement-deroberti.fr/sae/sae303/index.htmlclement-deroberti.frchevron-right
    Ws303DataVizmmi22b02.mmi-troyes.frchevron-right