You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
mvfront-react/components/Bulles.jsx

187 lines
5.6 KiB

import React from "react";
function Bulles(props) {
// récupération des résultats de l'élection et stockage en tableau
const votesBrut = Object.values(props)[0];
// déclaration et initialisation des mentions et couleurs
const mentionsBrut = [
"Passable",
"Assez bien",
"Bien",
"Très bien",
"Excellent",
];
const couleursBrut = ["#BB9C42", "#AABA44", "#DCDF44", "#B3D849", "#61AD45"];
//----------- Traitement des données -----------//
// fonction d'inversement des éléments de tableau
function inverse(obj) {
var retobj = {};
for (var key in obj) {
retobj[obj[key]] = key;
}
return retobj;
}
// fonction de réduction d'amplitude permettant de conserver une représentation ordinale du nombre de votes sans décalage visuel trop important
/*
Pattern de calcul :
Soient Ai, Bi, Ci, Di, Ei les nombres de votes initiaux fournis dans le tableau classé par ordre mélioratif de mention (de Passable à Excellent). Il vient :
A = 1
B = <{[1 + (Bi/Ai)] / 40} * A>
C = <{[1 + (Ci/Bi)] / 40} * B>
D = <{[1 + (Di/Ci)] / 40} * C>
E = <{[1 + (Ei/Di)] / 40} * D>
*/
function redAmpli(tab) {
var nvTab = [];
nvTab[0] = 100;
for (i = 1; i < tab.length; i++) {
nvTab[i] = (1 + tab[i] / tab[i - 1] / 40) * nvTab[i - 1];
}
return nvTab;
}
// déclaration de l'objet votes-mention et votes-couleur
var votesMentionNonOrdonnes = {};
var votesCouleurNonOrdonnes = {};
// initialisation votes-mention ordonnés croissants
for (var i = 0; i < mentionsBrut.length; i++) {
votesMentionNonOrdonnes[votesBrut[i]] = mentionsBrut[i];
votesCouleurNonOrdonnes[votesBrut[i]] = couleursBrut[i];
}
// déclaration des mentions-votes par ordre croissant
var votesMentionOrdonnes = inverse(votesMentionNonOrdonnes);
var votesCouleurOrdonnes = inverse(votesCouleurNonOrdonnes);
// vérification du nombre de votes classés par ordre croissant et passés initialement en propriétés au composant
console.log(
"Les données transmises au composant concernant le nombre de votes par mention sont : "
);
console.log(votesBrut);
// vérification des mentions destinées à être associées aux votes et ordonnées initialement par ordre mélioratif
console.log(
"Les mentions des votes sont classées initialement par ordre mélioratif de la façon suivante :"
);
console.log(mentionsBrut);
// vérification du nombre de votes classés par ordre croissant
console.log(
"Les mentions-votes classées par ordre croissant de votes sont : "
);
console.log(votesMentionOrdonnes);
// séparation des mentions et des votes
const mentions = Object.keys(votesMentionOrdonnes);
const votes = Object.values(votesMentionOrdonnes);
const couleurs = Object.keys(votesCouleurOrdonnes);
// vérification des mentions et des votes prêts à être traités pour la représentation graphique
console.log(
"La liste des mentions issue du classement par ordre croissant de votes est :"
);
console.log(mentions);
console.log(
"La liste du nombre de votes correspondant, classée par ordre croissant, est :"
);
console.log(votes);
// déclaration et initialisation des rayons de bulle pour la représentation graphique
var rayons = [];
rayons = redAmpli(votes);
// vérification des rayons
console.log(
"La liste des rayons à représenter graphiquement est la suivante :"
);
console.log(rayons);
// déclaration et initialisation des textes des bulles
const texteBulle1 = (mentions[0] + "<br>" + votes[0] + " votes").toString();
const texteBulle2 = (mentions[1] + "<br>" + votes[1] + " votes").toString();
const texteBulle3 = (mentions[2] + "<br>" + votes[2] + " votes").toString();
const texteBulle4 = (mentions[3] + "<br>" + votes[3] + " votes").toString();
const texteBulle5 = (mentions[4] + "<br>" + votes[4] + " votes").toString();
// déclaration et initialisation d'une instance de graphique en bulles
// const Plot = createPlotComponent(plotly);
const Plot = require("react-plotly.js").default;
//---------------------------------------------//
//----------- Affichage des données -----------//
const [loading, setLoading] = React.useState(true);
React.useEffect(() => {
setTimeout(() => setLoading(false), 3000);
});
return (
// <div>
// {!loading ? (
// <React.Fragment>
<Plot
data={[
{
x: [0.7, 0.6, 0.5, 0.6, 0.7],
y: [0.3, 0.4, 0.5, 0.6, 0.5],
hovertemplate: "<b>%{text}</b>" + "<extra></extra>",
text: [
texteBulle1,
texteBulle2,
texteBulle3,
texteBulle4,
texteBulle5,
],
showlegend: false,
mode: "markers",
marker: {
color: [
couleurs[0],
couleurs[1],
couleurs[2],
couleurs[3],
couleurs[4],
],
size: rayons,
},
},
]}
layout={{
width: 600,
height: 600,
title: "Nombre de voix par candidat",
xaxis: {
showgrid: false,
showticklabels: false,
showline: false,
zeroline: false,
range: [0, 1],
},
yaxis: {
showgrid: false,
showticklabels: false,
showline: false,
zeroline: false,
range: [0, 1],
},
}}
config={{
displayModeBar: false, // this is the line that hides the bar.
}}
/>
// </React.Fragment>
// ) : (
// <LoadingScreen />
// )}
// </div>
);
}
export default Bulles;