2014-09-30 9 views
10

Ich muss nur ein d3-Balkendiagramm von Daten aus einer SQL-Abfrage abgerufen, so dass ich keine Tsv oder CSV-Datei, sondern eine Zeichenfolge von Daten in CSV haben Format. Ich weiß, dass ich die d3.csv.parse-Methode verwenden kann, aber irgendwie konnte ich nicht herausfinden, wie man den Beispielcode für das CSV-Balkendiagramm mit den Daten aus einer Datei in die csv.parse-Methode für Daten konvertiert, die in einer String-Variablen enthalten sind.Konvertieren einer d3.csv-Methode in d3.csv.parse Methode

hier ist der Beispielcode für CSV-Datei:

d3.csv("data.csv", type, function(error, data) { 
    x.domain(data.map(function(d) { return d.letter; })); 
    y.domain([0, d3.max(data, function(d) { return d.frequency; })]); 

hier ist die Beispieldaten zu Testzwecken und den Code, der nicht

var bardata="letter,frequency\nA,0.89\nB,0.71\nC,0.45"; 
d3.csv.parse(bardata,type, function(data) { 
    x.domain(data.map(function(d) { return d.letter; })); 
    y.domain([0, d3.max(data, function(d) { return d.frequency; })]); 

Offenbar kann nicht arbeiten, ich nicht einfach eine ersetzen Datei mit einer Var, die den Inhalt der Datei enthält. Was wäre der beste Weg, dies zu tun?

Vielen Dank

Antwort

15

d3.csv.parse akzeptiert nur zwei Parameter - eine Zeichenfolge, die CSV-Daten enthält und eine Zugriffsfunktion, die Sie verwenden können, das Datenfeld zu konstruieren. Beachten Sie den Unterschied zwischen d3.csv und d3.tsv, die beide auch die Callback-Funktion als Parameter akzeptieren.

letters = d3.csv.parse(bardata, function(d) { 
    return { 
     letter:d.letter, 
     frequency:+d.frequency 
    }; 
}); 

Dies würde CSV Daten in bardata parsen und die Werte als Array in letters setzen. Tatsächlich ist die Accessor-Funktion optional. Folgendes würde auch das Gleiche tun:

Sobald Sie das Array haben, können Sie das Balkendiagramm wie üblich erstellen. Siehe Schnipsel unten.

var bardata="letter,frequency\nA,0.89\nB,0.71\nC,0.45"; 
 

 
var margin = {top: 20, right: 30, bottom: 30, left: 40}, 
 
    width = 960 - margin.left - margin.right, 
 
    height = 500 - margin.top - margin.bottom; 
 

 
var x = d3.scale.ordinal() 
 
    .rangeRoundBands([0, width], .1, .2); 
 

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

 
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 + ")"); 
 

 
letters = d3.csv.parse(bardata, function(d) { 
 
    return { 
 
     letter:d.letter, 
 
     frequency:+d.frequency 
 
    }; 
 
}); 
 

 
x.domain(letters.map(function(d) { return d.letter; })); 
 
y.domain([0, d3.max(letters, function(d) { return d.frequency; })]); 
 

 
svg.append("g") 
 
    .attr("class", "x axis") 
 
    .attr("transform", "translate(0," + height + ")") 
 
    .call(d3.svg.axis().scale(x).orient("bottom")); 
 

 
svg.append("g") 
 
    .attr("class", "y axis") 
 
    .call(d3.svg.axis().scale(y).orient("left")); 
 

 
svg.selectAll(".bar") 
 
    .data(letters) 
 
    .enter().append("rect") 
 
    .attr("class", "bar") 
 
    .attr("x", function(d) { return x(d.letter); }) 
 
    .attr("width", x.rangeBand()) 
 
    .attr("y", function(d) { return y(d.frequency); }) 
 
    .attr("height", function(d) { return height - y(d.frequency); });
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.0.4/d3.min.js"></script>