2016-12-01 3 views
0

Ich habe zwei Probleme, die ich kämpfen, um zu verstehen oder lösen in meinem folgenden d3-Code (zeigt die einfachste Version des Problems). Hintergrund ist, dass ich versuche, Linien aus einer CSV-Datei (gesamte Inhalte am Ende eingefügt und vollständige Code, der auch unten läuft) zu plotten. Die ersten 2 Zeilen (um das Format der CSV veranschaulicht) sind:d3 mehrere Linien Graphen

date,cust,prod,units 
2012-04-01,team1,A,34 

Grundsätzlich gibt es Kunden (team1, team2, team3) dass Kaufeinheiten von Produkten (A, B, C, D). Ich versuche, Liniendiagramme nach Produkt (A, B, C, D) zu filtern. Dies funktioniert individuell. Da jedoch die Einheiten und Datumsbereiche für jedes Produkt (A, B, C, D) unterschiedlich sind, versuche ich zunächst, meinen Bereich auf den maximalen Datumsbereich und die maximal verkauften Einheiten festzulegen. Wenn ich das tue, sieht die Achse korrekt aus, aber das Diagramm wird nicht gezeichnet. Wenn ich nur die gefilterten Daten verwende, funktioniert die Grafik gut. Was vermisse ich? Ich sehe keine JS-Fehler in der Konsole. Mein nächstes Ziel ist das Hinzufügen und Entfernen der Graphen (über Checkboxen), ohne etwas neu zeichnen zu müssen, was ist der einfachste Weg das zu erreichen?

<!DOCTYPE html> 
<meta charset="utf-8"> 
<style> /* set the CSS */ 

#line1 { 
    fill: none; 
    stroke: steelblue; 
    stroke-width: 1px; 
} 

</style> 

<div id="customer"> 

    <input class="custCB" type="checkbox" id="D_CB" name="cust" value="D" enabled onclick="showGraph('D')"> D<br> 
    <input class="custCB" type="checkbox" id="C_cb" name="cust" value="C" enabled onclick="showGraph('C')"> C<br> 
    <input class="custCB" type="checkbox" id="B_cb" name="cust" value="B" enabled onclick="showGraph('B')"> B<br> 
    <input class="custCB" type="checkbox" id="A_cb" name="cust" value="A" enabled onclick="showGraph('A')"> A<br> 
</div> 
<body> 

<!-- load the d3.js library --> 
<script src="https://d3js.org/d3.v4.min.js"></script> 
<script> 
    showGraph("D"); 

    function showGraph(prod_name) { 
    var mydomain = 5000; 
    var margin = {top: 20, right: 20, bottom: 30, left: 50}, 
      width = 960 - margin.left - margin.right, 
      height = 500 - margin.top - margin.bottom; 
    // parse the date/time 
    var parseTime = d3.timeParse("%Y-%m-%d"); 
    // set the ranges 
    var x = d3.scaleTime().range([0, width]); 
    var y = d3.scaleLinear().domain([mydomain, 0]).range([height, 0]); 
    //console.log(y); 
    // define the 1st line 
    var valueline = d3.line() 
      .x(function (d) { 
       return x(d.date); 
      }) 
      .y(function (d) { 
       return y(d.units); 
      }); 

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


    // Get the data 
    d3.csv("test2.csv", function (error, tdata) { 

     if (error) throw error; 

     data = tdata.filter(e=> e.prod===prod_name); 
     //_data = data.filter(e=> e.cust==="team2"); 
     //console.log("__data_", _data); 
     // format the data 
     console.log("data:", data); 

     data.forEach(function (d) { 
      d.date = parseTime(d.date); 
      d.units = parseInt(d.units); 
     }); 
     tdata.forEach(function (d) { 
      d.date = parseTime(d.date); 
      d.units = parseInt(d.units); 
     }); 
     x.domain(d3.extent(tdata, function (d) { 
      console.log(d.date); 
      return d.date; 
     })); 
     //console.log("data", data); 
     var m = d3.max(tdata, function (d) { 
      console.log(d.units); 
      var m = parseInt(d.units); 
      return m; 
     }); 
     console.log("Max:", m); 
     y.domain([0, m]); 
     console.log("tdata:", tdata); 
     //console.log("data:", data); 
     svg.append("path") 
       .data([data]) 
       .attr("id", "line1") 
       .attr("d", valueline); 
     //console.log("DATA", data); 
     svg.selectAll(".point") 
       .data(data) 
       .enter() 
       .append("circle") 
       .attr("class", "point") 
       .attr("cx", function (d) { 
        return x(d.date); 
       }) 
       .attr("cy", function (d) { 
        return y(d.units); 
       }) 
       .attr("r", 4) 
       .on("mouseover", function (d) { 
        console.log(d.units) 
       }); 

     svg.append("g") 
       .attr("id", "xaxis") 
       .attr("transform", "translate(0," + height + ")") 
       .call(d3.axisBottom(x)); 

     // Add the Y Axis 
     svg.append("g") 
       .attr("id", "yaxis") 
       .call(d3.axisLeft(y)); 

    }); 
    } 

</script> 
</body> 

test2.csv 
date,cust,prod,units 
2012-04-01,team1,A,34 
2012-04-02,team1,B,45 
2012-04-03,team2,D,67 
2012-04-04,team1,A,78 
2012-04-05,team3,C,89 
2012-04-06,team2,D,99 
2012-04-07,team2,A,101 
2012-04-08,team3,A,122 
2012-04-09,team1,C,134 
2012-04-10,team1,C,160 
2012-04-11,team2,C,180 
2012-04-12,team2,D,210 
2012-04-13,team3,D,223 
2012-04-14,team1,D,229 
2012-04-15,team1,D,241 
2012-04-16,team2,D,258 
2012-04-17,team2,C,350 
2012-04-18,team3,D,305 
2012-04-19,team3,B,335 
2012-04-20,team2,B,375 
2012-04-21,team3,D,345 
2012-04-22,team1,A,534 
2012-04-23,team1,C,578 
2012-04-24,team2,A,590 
2012-04-25,team1,B,601 
2012-04-26,team3,B,387 
2012-04-27,team2,C,613 
2012-04-28,team2,D,645 
2012-04-29,team3,D,410 
2012-04-30,team1,A,612 
2012-05-01,team2,A,670 
2012-05-02,team3,A,657 
2012-05-03,team1,A,690 
2012-05-04,team3,A,709 
2012-05-05,team2,C,690 
2012-05-06,team3,B,740 
2012-05-07,team1,A,1000 

Antwort

1

Dieser Ausschnitt ist problematisch:

data.forEach(function (d) { 
    d.date = parseTime(d.date); 
    d.units = parseInt(d.units); 
}); 
tdata.forEach(function (d) { 
    d.date = parseTime(d.date); 
    d.units = parseInt(d.units); 
}); 

tdata und data sind Arrays Referenzen auf die gleichen Objekte zu halten. Die zweite forEach wirkt dann auf die gleichen Objekte und die parseTime schlägt fehl. Just do:

tdata.forEach(function(d) { 
    d.date = parseTime(d.date); 
    d.units = parseInt(d.units); 
}); 

var data = tdata.filter(e => e.prod === prod_name); 

Here's your code all cleaned up.

+0

Vielen Dank, ich dachte, es tatsächlich aus kurz nach der Einlieferung. – user3079275

Verwandte Themen