2017-06-28 1 views
0

J'ai besoin de faire un graphique à barres empilé inhabituelle et acutally, je n'ai aucune idée réelle de la façon de le faire.D3 diagramme à barres empilé inhabituel

En général, il semble vraiment facile:

Je dispose d'un fichier CSV avec des valeurs différentes qui peuvent être soit int ou une chaîne. Chaque rangée a le même nombre de valeurs.

J'ai besoin maintenant de faire un graphique à barres empilées qui effectue les opérations suivantes:

barre pour chaque -One colonne colonne -Chaque doit avoir la même hauteur (cause même quantité d'entrées pour chaque colonne) et CHAQUE barre doit avoir une quantité différente de piles, une pile pour chaque valeur différente qui existe. (Plus souvent une valeur existe, plus cette pile devrait être)

Un exemple de fichier CSV serait:

Day, Value 
Mo, 5 
Mo, 3 
Tu, 5 
Tu, 6 

Donc, pour la ligne de jour je besoin de 2 piles la même hauteur et pour la ligne de valeur 3 piles où l'un est 1/2 hauteur et les deux autres 1/4 chacun.

Et c'est le problème que j'ai. Chaque exemple que je peux trouver sur Internet fonctionne avec la même quantité de piles pour chaque barre. (Par exemple: https://bl.ocks.org/mbostock/3886394 ou https://bl.ocks.org/mbostock/1134768)

Des sugestions comment je peux résoudre ce problème?

Répondre

0

Vous devez gérer chaque colonne comme une pile distincte et les positionner dans votre graphique. Ce violon: https://jsfiddle.net/gwhn1sgv/2/ montre comment.

Les données pour i. e. la première colonne besoin d'être transformé en un histogramme comme celui-ci:

var column = 'Day'; 
var histo = { Mo: 2, Tu: 2 } 

Ensuite, vous pouvez empiler et de les transformer:

var keys = Object.keys(histo); 
var stack = d3.stack() 
    .keys(keys)([histo]) 
    //unpack the column 
    .map((d, i) => { 
    return {key: keys[i], data: d[0]} 
    }); 

ils ressemblent à ceci:

var stack = [ 
    { key: 'Mo', data: [0, 2] }, 
    { key: 'Tu', data: [2, 4] } 
] 

Si vous avoir une échelle de bande

var x = d3.scaleBand() 
    .domain(data.columns); 

vous pouvez construire la colonne graphique à barres à x(column):

+0

merci beaucoup! Je vais essayer d'implémenter cela demain, mais il semble résoudre mon problème – Grogak

+0

Hey, moi encore ... J'ai deux autres questions et après avoir essayé pendant un jour j'abandonne. Disons que j'ai un plus grand fichier csv avec 10-20 colonnes, et je veux le construire avec seulement 4-5 colonnes spécifiques, comment puis-je filtrer les colonnes que je veux utiliser? J'ai essayé avec: 'd3.keys (données [0]). Filter (fonction (d) {return d.match (/.../);})' mais je ne sais pas vraiment où je avoir à mettre en œuvre cela. Je pense juste au début mais comment? Ensuite: Est-il possible d'ajouter un peu d'espace entre chaque pile? En fait, je veux vraiment faire cela tout seul, mais il semble que je suis ennuyeux pour d3 .. – Grogak

+0

1.Ajoutez 'data.columns.filter()' directement après avoir chargé le fichier csv dans 'data' et avant la boucle' for ... of'. (ligne 2 dans le violon) 2. Utilisez la méthode 'x.padding()', comme dans le violon, ligne 6. – ccprog