2016-05-23 18 views
1

Ich mache, was ein sehr einfaches Kreisdiagramm sein soll, aber irgendwie wird die d3.json-Funktion überhaupt nicht ausgeführt. Mein Code ist als unten:d3.json wird nicht ausgeführt

function omst1() { 
"use strict"; 
var chartWidth = $("#chart").width()*0.5; 
var chartHeight = $("#chart").height()*0.5; 

var margin = { 
    top: chartWidth*0.01, 
    right: chartWidth*0.01, 
    bottom: chartWidth*0.01, 
    left: chartWidth*0.01 
}, 
width = chartWidth - margin.left - margin.right, 
height = chartHeight - margin.top - margin.bottom, 
radius = Math.min(width, height)/2; 

var color = d3.scale.ordinal() 
.range(["#F1BD98", "#DA6A26", "#82A0D3", "#094D86"]) 

var arc = d3.svg.arc() 
.outerRadius(radius - margin.bottom) 
.innerRadius(radius - margin.bottom); 

var pie = d3.layout.pie() 
.sort(null) 
.value(function(d) { 
    return d.Aantal 
} 
); 

var svg = d3.select("#omst1").append("svg") 
.attr("width", width) 
.attr("height", height) 
.append("g") 
.attr("transform", "translate(" + width/2 + "," + height/2 + ")"); 

d3.json("omstandigheden.json", type, function(error, data) { 
    if (error) throw error; 
    console.log(data); 
    var g = svg.selectAll(".arc") 
     .data(pie(data)) 
    .enter().append("g") 
     .attr("class", "arc"); 

    g.append("path") 
     .attr("d", arc) 
     .style("fill", function(d) { return color(d.data.Omstandigheid); }); 

    g.append("text") 
     .attr("transform", function(d) { return "translate(" + labelArc.centroid(d) + ")"; }) 
     .attr("dy", ".35em") 
     .text(function(d) { return d.data.Omstandigheid; }); 
}); 

    function type(d) { 
    d.Aantal = +d.Aantal; 
    return d; 
    } 
} 

Mit diesem Setup die console.log (Daten) sollte ein Objekt mit Werten zurückgeben von und aantal omstandigheid, die JSON-Datei ist ein Array von Objekten, wie folgt aussehen :

{ 
    "Omstandigheid": "A", 
    "Aantal": 2 
    }, 

Zuerst dachte ich, meine Einrückung war ausgeschaltet, oder ich habe einfach Klammern an der falschen Stelle geschlossen. Leider habe ich den Fehler in meinem Code noch nicht gefunden, was mache ich falsch?

BEARBEITEN: Nach Gerardos Antwort habe ich den Parameter 'type' entfernt und den Code für forEach anstelle von 'type' geändert. Der geänderte Code ist nun wie folgt:

d3.json("omstandigheden.json", function(error, data) { 
     if (error) throw error; 
     console.log(data); 
     var g = svg.selectAll(".arc") 
     .data(pie(data)) 
     .enter().append("g") 
     .attr("class", "arc"); 

     g.append("path") 
     .attr("d", arc) 
     .style("fill", function(d) { return color(d.data.Omstandigheid); }); 

     g.append("text") 
     .attr("transform", function(d) { return "translate(" + labelArc.centroid(d) + ")"; }) 
     .attr("dy", ".35em") 
     .text(function(d) { return d.data.Omstandigheid; }); 

    data.forEach(function(d) { 
     d.Aantal = +d.Aantal; 
     return d; 
    }) 
}); 
} 
+2

Konnten Sie ein PLNKR zusammen oder etwas erhalten? Oder zeigen Sie all Ihren Code, den Sie haben, fehlt etwas – thatOneGuy

+0

nichts in der Konsole? Erhalten Sie das 'svg' Element in Ihrem DOM mit der richtigen Breite und Höhe? Hast du den Dateinamen und den Pfad überprüft? – tarulen

+2

verwenden Sie: d3.json (Datei, Typ, Rückruf). Was macht dieser Typparameter dort? Ich kann nicht scheinen, solch eine Unterschrift in der D3-Dokumentation zu finden ... –

Antwort

5

die type im JSON-Funktion entfernen. JSON-Funktionen erlauben keine "Accessoren", nur CSV- und TSV-Funktionen erlauben sie.

So entfernen Sie die type und alles tun, die type Funktion eines forEach in Ihrer JSON-Funktion nicht verwenden.

Die erste Zeile Ihrer JSON-Funktion muss sein:

d3.json("omstandigheden.json", function(error, data) { 

PS: Wenn Sie das ein Schreiben des JSON sind, Sie brauchen nicht die type Funktion: nur die Werte als Zahlen schreiben, nicht Saiten.

+0

Danke für das Update, immer schön, rudimentären Code loszuwerden :) – Yoeri