2016-07-10 8 views
0

Ich arbeite mit d3.js, um ein einfaches Balkendiagramm zu erstellen. Ich habe Balkendiagramme mit Daten erstellt. Jetzt versuche ich jedoch, nur eine Spalte von csvfile zu verwenden.Textfelder aus csv-Dataset in d3 js zählen

Alle Elemente aus dieser Spalte sind Zeichenfolgenwerte, insbesondere Städte. Einige von ihnen sind einzigartig, andere erscheinen mehr als einmal.

Beispiel:

city 
Mor 
Gdl 
Mex 
Bog 
Mad 
Rio 
Bar 
Mor 
Gdl 
Mor 
Rio 
Mor 
Bog 
Mor 

Ich möchte ein Balkendiagramm mit dieser Spalte erstellen. x value wird die Stadt sein und y value wird die Anzahl sein, wie oft die Stadt erscheint.

Ich arbeite mit diesem Code. Allerdings kann ich nicht y value erhalten:

d3.csv("../cities.csv", function(error, dataset) { 
    dataset.forEach(function(d) { 
     d.count = +d.city; 
    }); 
    x.domain(dataset.map(function(d) { return d.city; })); 
    y.domain([0, d3.max(dataset, function(d) { return d.count; })]); 
    svg.append('g') 
     .attr('class', 'x axis') 
     .attr('transform', 'translate(0,' + h + ")") 
     .call(xAxis); 
    svg.append('g') 
     .attr('class', 'y axis') 
     .call(yAxis) 
     .append('text') 
     .attr('transform', 'rotate(-90)') 
     .attr('y', 6) 
     .attr('dy', '.71em') 
     .style('text-anchor', 'end') 
     .text('Número de contratistas'); 
    var bars = svg.selectAll('.bar') 
     .data(dataset) 
     .enter() 
     .append('rect') 
     .attr('class', 'bar') 
     .attr('x', function(d) { return x(d.city); }) 
     .attr('width', x.rangeBand()) 
     .attr('y', function(d) { return y(d.count); }) 
     .attr('height', function(d) { return h - y(dataset.map(d.count));}); 
}); 

Von diesem Code, mein erster Versuch, das Zählen von jeder Stadt zu bekommen war:

dataset.forEach(function(d) { 
    d.count = +d.city; 
}); 

Wie kann ich diese fucntion verbessern, um diese Art zu erhalten von Balkendiagramm?

Alle Vorschläge zur Verbesserung sind willkommen! Vielen Dank.

Antwort

1

Wenn ich Sie richtig verstehe, möchten Sie zählen, wie oft jede Stadt auftritt und speichern Sie sie in d.count. Versuchen Sie dies:

// define count object that holds count for each city 
var countObj = {}; 

// count how much each city occurs in list and store in countObj 
dataset.forEach(function(d) { 
    var city = d.value; 
    if(countObj[city] === undefined) { 
     countObj[city] = 0; 
    } else { 
     countObj[city] = countObj[city] + 1; 
    } 
}); 
// now store the count in each data member 
dataset.forEach(function(d) { 
    var city = d.value; 
    d.count = countObj[city]; 
}); 
+0

Danke, @Stuurpiek Ich versuchte Ihr Beispiel, aber es nicht die Werte aus jeder Stadt. Ich denke, wenn d3.histogram() eine Lösung sein könnte. – estebanpdl

+0

Nach einer kleinen Änderung meines Codes funktioniert Ihr Beispiel großartig! Vielen Dank! – estebanpdl

+0

Eine Frage: Was bedeutet 'undefiniert'? – estebanpdl