2016-05-04 6 views
1

Ich habe Daten zur Aktivitätsverfolgung, die ich mit einem Balkendiagramm zeichnen möchte. Warum werden in meinem Balkendiagramm die Berichte nicht dargestellt? Ich kann den Fehler nicht sehen, den ich gemacht habe. Ich denke, ich habe die Datenstruktur richtig, aber ich kann überhaupt nicht überprüfen. Die Daten werden mit dieser GitHub gist geliefert.Bargraph nicht rendern d3

<!DOCTYPE html> 
 
<meta charset="utf-8"> 
 

 
<svg class="chart"></svg> 
 
<script src="//d3js.org/d3.v3.min.js" charset="utf-8"></script> 
 

 
<script> 
 
    var margin = { 
 
     top: 20, 
 
     right: 20, 
 
     bottom: 70, 
 
     left: 40 
 
    }, 
 
    width = 900 - margin.left - margin.right, 
 
    height = 700 - margin.top - margin.bottom; 
 

 

 

 
    var parseDate = d3.time.format("%H:%M:%S").parse; 
 
    var x = d3.time.scale().range([0, width]); 
 

 
    var y = d3.scale.linear().range([height, 0]); 
 

 
    var xAxis = d3.svg.axis() 
 
    .scale(x) 
 
    .orient("bottom") 
 
    //.tickFormat(d3.time.format("%H:%M:%S")); 
 

 
    var yAxis = d3.svg.axis() 
 
    .scale(y) 
 
    .orient("left") 
 
    .ticks(10); 
 

 
    var svg = d3.select("body").append("svg") 
 
    .attr("width", width + margin.left + margin.right) 
 
    .attr("height", height + margin.top + margin.bottom) 
 
    .append("g") 
 
    .attr("transform", 
 
     "translate(" + margin.left + "," + margin.top + ")"); 
 

 

 
    d3.json("data/testdata.json", function(data) { 
 

 

 

 
    x.domain(d3.extent(data.dataset, function(d) { 
 
     return parseDate(d.time); 
 
    })); 
 
    // x.domain(d3.map(data.dataset, function(d) { 
 
    // console.log(d.time); 
 
    //  return parseDate(d.time) 
 
    // })); 
 
    // y.domain(d3.extent(data, function(d, i) { 
 
    //  return d.dataset[i].steps; 
 
    // })); 
 
    y.domain([0, d3.max(data.dataset, function(d) { 
 
     return d.steps; 
 
    })]); 
 

 
    svg.append("g") 
 
     .attr("class", "x axis") 
 
     .attr("transform", "translate(0," + height + ")") 
 
     .call(xAxis) 
 
     .selectAll("text") 
 
     .style("text-anchor", "end") 
 
     // .text("Time") 
 
     .attr("dx", "-.8em") 
 
     .attr("dy", "-.55em") 
 
     .attr("transform", "rotate(-90)"); 
 

 
    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("Steps"); 
 

 
    svg.selectAll("bar") 
 
     .data(data) 
 
     .enter().append("rect") 
 
     .style("fill", "steelblue") 
 
     .attr("class", "bar") 
 
     .attr("x", function(d, i) { 
 
     return x(parseDate(d.dataset[i].time)); 
 
     }) 
 
     .attr("y", function(d, i) { 
 
     return y(d.dataset[i].steps); 
 
     }) 
 
     .attr("width", function(d) { 
 
     return width/d.dataset.length 
 
     }) 
 
     .attr("height", function(d, i) { 
 
     return height - y(d.dataset[i].steps); 
 
     }); 
 

 
    }); 
 
</script>

Können Sie mir einen Tipp geben? Muss ich meinen JSON auf andere Weise nisten/strukturieren? Es muss basisch sein, aber irgendwie kann ich nicht die Balkendiagramme

Antwort

0

OK hier ist eine Geige bekommen: https://jsfiddle.net/1nujczwh/11/

Zu allererst Dataset war falsch

svg.selectAll("bar") 
     .data(data) 

waren Sollte
svg.selectAll("bar") 
     .data(data.dataset) 

Andere als Ihre x, y und andere Attribute benötigen etwas Arbeit. Wie:

return x(parseDate(d.dataset[i].time)); 

return x(parseDate(d.time)); 

werden sollte, da d3 bereits durch Ihre Daten Looping, müssen Sie sie nicht mit Array, um [index]

Da alle Schritte von 0 I Ich weiß nicht, was Sie erwartet haben, also habe ich ein paar Daten als Beispiel geändert.

Ich schlage vor, eine console.log(d); (ich habe das schon für Sie getan) innerhalb Ihrer Attribute zu sehen, was Ihre Daten sind.