2017-06-26 2 views
0

Können wir ein D3-Liniendiagramm mit Render Queue rendern? http://bl.ocks.org/syntagmatic/raw/3341641/D3 Liniendiagramm - Render-Warteschlange

Ich habe ein JSON mit etwa 50.000 Elementen darin. Mein Browser stürzt ab, wenn ich versuche, ein Diagramm mit so vielen Daten zu zeichnen.

-Code ist:

function lineChart(data, id){ 
 
\t // Set the dimensions of the canvas/graph 
 
\t var margin = {top: 30, right: 20, bottom: 30, left: 50}, 
 
\t \t width = 1000 - margin.left - margin.right, 
 
\t \t height = 370 - margin.top - margin.bottom; 
 

 
\t // Parse the date/time 
 
\t var parseDate = d3.time.format("%d-%b-%y").parse; 
 
\t // Define the div for the tooltip 
 
\t var div = d3.select("body").append("div") \t 
 
\t \t .attr("class", "tooltip") \t \t \t \t 
 
\t \t .style("opacity", 0); 
 
\t // Set the ranges 
 
\t var x = d3.time.scale().range([0, width]); 
 
\t var y = d3.scale.linear().range([height, 0]); 
 

 
\t // Define the axes 
 
\t var xAxis = d3.svg.axis().scale(x) 
 
\t \t .orient("bottom").ticks(5); 
 

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

 
\t // Define the line 
 
\t var valueline = d3.svg.line() 
 
\t \t .x(function(d) { return x(d.time); }) 
 
\t \t .y(function(d) { return y(d.loadaverage); }) 
 
\t \t \t 
 
\t // Adds the svg canvas 
 
\t var svg = d3.select(id) 
 
\t \t .append("svg") 
 
\t \t \t .attr("width", width + margin.left + margin.right) 
 
\t \t \t .attr("height", height + margin.top + margin.bottom) 
 
\t \t .append("g") 
 
\t \t \t .attr("transform", 
 
\t \t \t \t "translate(" + margin.left + "," + margin.top + ")"); 
 

 
    // Scale the range of the data 
 
    x.domain(d3.extent(data, function(d) { return d.time; })); 
 
    y.domain([0, d3.max(data, function(d) { return d.loadaverage; })]); 
 

 
\t \t // Add the valueline path. 
 
\t \t svg.selectAll('path') 
 
\t \t \t .data(pos) 
 
\t \t \t .enter() 
 
\t \t \t .append("path") 
 
\t \t \t .attr("class", "line") 
 
\t \t \t .attr("d", valueline(data)) 
 
\t \t \t .on("mouseover", function(d) { 
 
\t \t \t \t div.transition() \t \t 
 
\t \t \t \t \t .duration(200) \t \t 
 
\t \t \t \t \t .style("opacity", .9); \t \t 
 
\t \t \t \t div.html(d.time + "<br/>" + d.loadaverage) 
 
\t \t \t \t \t .style("left", (d3.event.pageX) + "px") \t \t 
 
\t \t \t \t \t .style("top", (d3.event.pageY - 28) + "px"); \t 
 
\t \t \t \t }) \t \t \t \t \t 
 
\t \t \t .on("mouseout", function(d) { \t \t 
 
\t \t \t \t div.transition() \t \t 
 
\t \t \t \t \t .duration(500) \t \t 
 
\t \t \t \t \t .style("opacity", 0); \t 
 
\t \t \t }); 
 

 
    // Add the X Axis 
 
    svg.append("g") 
 
     .attr("class", "x axis") 
 
     .attr("transform", "translate(0," + height + ")") 
 
     .call(xAxis); 
 

 
    // Add the Y Axis 
 
    svg.append("g") 
 
     .attr("class", "y axis") 
 
     .call(yAxis); 
 
}

+0

Hinweis: Ich verwende D3 Version 3 – ktrev

Antwort

0

Render Queue verwendet Leinwand, die mit 50k Elemente, sollten Sie wahrscheinlich verwenden. Leider unterstützt d3 v3 kein Canvas. Wenn Sie auf v4 upgraden können, erhalten Sie Canvas-Unterstützung und viel mehr Leistung. Im Prinzip können Sie progressives Rendering mit Linien durchführen, aber ich weiß nicht, ob Render Queue dies direkt unterstützt. Wir haben schließlich unseren eigenen Progressive Renderer für unser Produkt gerollt.

Seien Sie vorgewarnt, wenn Sie zum Canvas wechseln, müssen Sie überdenken, wie Sie Ihre Mausevents machen, weil Sie auf der Leinwand keine Elemente haben, an die Sie Listener anhängen können.