Construire un graphique multiligne avec D3.js Partie 2

Dans la partie précédente de cette série, nous avons vu comment commencer à créer un graphique multiligne à l'aide de la bibliothèque JavaScript D3.js. Dans ce didacticiel, nous allons passer au niveau suivant en faisant en sorte que le graphique multiligne réponde de manière dynamique aux données, et nous ajouterons quelques fonctionnalités supplémentaires au fur et à mesure de l'avancement du didacticiel..

Commencer

Commençons par cloner la première partie du didacticiel de GitHub.

clone de git https://github.com/jay3dec/MultiLineChart_D3.git

Aller vers MultiLineChart_D3 et parcourir index.html, et vous devriez avoir un graphique multiligne basé sur les données de l'échantillon.

Définition dynamique du domaine

Dans le tutoriel précédent, lorsque nous avons créé xScale et yScale en utilisant Intervalle et Domaine, nous avons codé en dur le minimum et le maximum pour le domaine. Pour rendre notre graphique plus flexible, nous devons lire les valeurs minimale et maximale du domaine de manière dynamique à partir de la source de données..

D3.js fournit le d3.min et d3.max méthodes pour obtenir les valeurs minimales et maximales d'un tableau, respectivement. Nous utiliserons ces fonctions pour obtenir les valeurs minimales et maximales du domaine..

Nous pouvons obtenir la valeur minimale d'un tableau comme indiqué:

d3.min (données, fonction (d) return d.value;)

De même, pour obtenir la valeur maximale:

d3.max (data, function (d) return d.value;)

Remplacez simplement les valeurs minimum et maximum dans la xScale domaine comme indiqué: 

xScale = d3.scale.linear (). range ([MARGINS.left, WIDTH - MARGINS.right]). domain ([d3.min (données, fonction (d) return d.year;), d3.max (données, fonction (d) return d.year;)]),

De même, remplacez le yScale domaine:

yScale = d3.scale.linear (). range ([HEIGHT - MARGINS.top, MARGINS.bottom]). domain ([d3.min (données, fonction (d) return d.sale;), d3.max (données, fonction (d) return d.sale;)]),

Enregistrez toutes les modifications et naviguez index.html. Maintenant, vous devriez avoir le graphique fonctionne bien, comme il était plus tôt. La seule différence est qu'il capte les valeurs maximales et minimales du domaine de manière dynamique..

Création dynamique du graphique linéaire

Conserver un seul objet JSON pour l'échantillon faciliterait l'analyse des données et leur tracé sur le graphique. Combinez donc les deux exemples de données en une seule chaîne de données JSON, comme indiqué ci-dessous: 

var data = ["Client": "ABC", "vente": "202", "année": "2000", "Client": "ABC", "vente": "215", "année" : "2002", "Client": "ABC", "Vente": "179", "Année": "2004", "Client": "ABC", "Vente": "199", " year ":" 2006 ", " Client ":" ABC "," Vente ":" 134 "," Année ":" 2008 ", " Client ":" ABC "," Vente ":" 176 " , "année": "2010", "Client": "XYZ", "vente": "100", "année": "2000", "Client": "XYZ", "vente": " 215 "," année ":" 2002 ", " client ":" XYZ "," vente ":" 179 "," année ":" 2004 ", " client ":" XYZ "," vente " : "199", "année": "2006", "Client": "XYZ", "vente": "134", "année": "2008", "Client": "XYZ", " vente ":" 176 "," année ":" 2013 "];

Nous allons maintenant modifier notre code pour que notre graphique soit redimensionné de manière dynamique en fonction du jeu de données exemple et de ses valeurs.. 

Ensuite, nous allons diviser et organiser les données sur la base Client afin que nous puissions dessiner un graphique linéaire pour chaque Client dans les données. D3 fournit une méthode appelée d3.nest qui aide à organiser les données basées sur un particulier clé champ. Nous allons utiliser d3.nest pour trier les données sur la base Client comme montré:

var dataGroup = d3.nest () .key (fonction (d) return d.Client;) .entries (data);

Voici comment dataGroup voudrais regarder: 

["clé": "ABC", "valeurs": ["Client": "ABC", "vente": "202", "année": "2000", "Client": "ABC", "vente": "215", "année": "2002", "client": "ABC", "vente": "179", "année": "2004", "client": "ABC "," vente ":" 199 "," année ":" 2006 ", " Client ":" ABC "," vente ":" 134 "," année ":" 2008 ", " Client ": "ABC", "vente": "176", "année": "2010"], "clé": "XYZ", "valeurs": ["Client": "XYZ", "vente": "100", "année": "2000", "Client": "XYZ", "vente": "215", "année": "2002", "Client": "XYZ", "vente ":" 179 "," année ":" 2004 ", " Client ":" XYZ "," vente ":" 199 "," année ":" 2006 ", " Client ":" XYZ ", "vente": "134", "année": "2008", "client": "XYZ", "vente": "176", "année": "2013"]]]]

Ensuite, retirez le svg code de chemin de ligne pour la création de ligne que nous avons précédemment codé en dur.

vis.append ('svg: path') .attr ('d', lineGen (data)) .attr ('stroke', 'vert') .attr ('stroke-width', 2) .attr ('fill' , 'aucun'); vis.append ('svg: path') .attr ('d', lineGen (data2)) .attr ('stroke', 'blue') .attr ('stroke-width', 2) .attr ('fill' , 'aucun');

Au lieu de cela, nous allons parcourir le dataGroup et créer un graphique linéaire pour chaque Client comme montré:

dataGroup.forEach (function (d, i) vis.append ('svg: path') .attr ('d', lineGen (d.values)) .attr ('stroke', 'blue') .attr (' largeur de trait ', 2) .attr (' remplissage ',' aucun '););

Enregistrez les modifications et essayez de parcourir index.html. Vous devriez pouvoir voir le graphique multiligne comme indiqué: 

Ajoutons également des couleurs aléatoires aux lignes du graphique. Pour ajouter des couleurs aléatoires, nous utiliserons la méthode d3.hsl. Modifier le accident vasculaire cérébral attribut du graphe linéaire comme indiqué ci-dessous pour obtenir des couleurs aléatoires pour les lignes.

dataGroup.forEach (function (d, i) vis.append ('svg: path') .attr ('d', lineGen (d.values)) .attr ('stroke', fonction (d, j) return "hsl (" + Math.random () * 360 + ", 100%, 50%)";) .attr ('stroke-width', 2) .attr ('fill', 'none');) ;

Enregistrez les modifications et parcourez index.html. Vous devriez voir des couleurs aléatoires pour les lignes sur le graphique.

Ajout de légendes

Ensuite, nous ajouterons légendes pour le Les clients dans les données de l'échantillon. Une fois les légendes ajoutées, nous attacherons un événement de clic sur les légendes qui permuterait l'affichage des graphiques linéaires respectifs..

Tout d'abord, afin d'ajouter la légende, nous devons modifier le fond de la marge et dessus de la marge à 50 pour accueillir les légendes.

var vis = d3.select ("# visualisation"), WIDTH = 1000, HEIGHT = 500, MARGES = en haut: 50, à droite: 20, en bas: 50, à gauche: 50,

En itérant le dataGroup, nous ajouterons les légendes pour les graphiques linéaires correspondants. Ajouter des légendes est assez simple. Tout d’abord, définissez l’espace de la légende en fonction du nombre de clients ou de graphiques linéaires que nous allons dessiner:

lSpace = WIDTH / dataGroup.length;

Ajouter un texte à l’élément svg avec les coordonnées x et y tout en itérant le dataGroup après la création de la ligne comme indiqué:

vis.append ("text") .attr ("x", (lSpace / 2) + i * lSpace) .attr ("y", HEIGHT) .style ("fill", "noir") .text (d. clé);

Nous avons ajusté l'espacement de la légende (lSpace) En fonction du nombre de légendes que nous devons montrer, de sorte que toutes les légendes soient à égale distance les unes des autres. Nous avons divisé la légende par 2 pour qu’elle soit centrée dans son espace et qu’elle le soit au fur et à mesure de son avancement, au fur et à mesure que nous ajoutons (i * lSpace) aux légendes à venir.

Enregistrez toutes les modifications et essayez de naviguer index.html et vous devriez voir les légendes en dessous de l'axe X.

Ajoutons un peu de style aux légendes pour les rendre audacieuses. Ajoutez le CSS suivant à index.html:

.légende taille de la police: 14px; poids de police: gras; 

Ajouter la classe Légende à la légende créée.

vis.append ("text") .attr ("x", (lSpace / 2) + i * lSpace) .attr ("y", HEIGHT) .style ("fill", "noir") .attr ("class "," légende ") .text (d.key);

D3.js événements

Ajoutons maintenant des événements de clic sur chacune des légendes affichées pour basculer l'affichage de la ligne correspondante sur le graphique multiligne..

Tout d'abord, nous aurons besoin d'ajouter un identifiant pour chaque graphe linéaire créé afin de basculer son affichage.

.attr ('id', 'line _' + d.key)

Voici à quoi ressemble le code de création de ligne:

vis.append ('svg: path') .attr ('d', lineGen (d.values, xScale, yScale)) .attr ('stroke', fonction (d, j) return "hsl (" + Math. random () * 360 + ", 100%, 50%)";) .attr ('stroke-width', 2) .attr ('id', 'line_' + d.key) .attr ('fill' , 'aucun');

Ensuite, dans la partie création de la légende, ajoutez le Cliquez sur attribut:

.on ('click', function () alert (d.key);)

Enregistrer le changement et parcourir index.html. Cliquez sur les légendes et vous devriez voir les noms des légendes comme des alertes.. 

Ensuite, ajoutons le code pour basculer l’affichage des lignes. Nous devons simplement vérifier l'état d'affichage actuel du graphique linéaire et basculer l'opacité pour afficher et masquer la ligne en conséquence..

.on ('click', function () var active = d.active? false: true; var opacité = active? 0: 1; d3.select ("# ligne_" + d.key) .style ("opacité", opacité); d.active = active;)

Enregistrez les modifications et essayez de parcourir index.html. Essayez de cliquer sur les légendes et l’affichage du graphique linéaire correspondant devrait basculer..

Conclusion

Dans ce tutoriel, nous avons vu comment rendre notre graphique multiligne dynamique. Nous avons également vu comment créer des événements D3.js. Pour des informations détaillées sur diverses autres méthodes et API D3.js, consultez la documentation officielle..

Le code source de ce tutoriel est disponible sur GitHub.

Faites-nous savoir vos pensées dans les commentaires ci-dessous!