D3折线图 - 渲染队列

时间:2017-06-26 01:45:21

标签: performance d3.js queue

我们可以使用渲染队列渲染D3折线图吗?http://bl.ocks.org/syntagmatic/raw/3341641/

我有一个JSON,其中包含大约50,000个元素。当我尝试使用这么多数据绘制图表时,我的浏览器崩溃了。

代码是:

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

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

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

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

	// Define the line
	var valueline = d3.svg.line()
		.x(function(d) { return x(d.time); })
		.y(function(d) { return y(d.loadaverage); })
			
	// Adds the svg canvas
	var svg = d3.select(id)
		.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 + ")");

    // 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; })]);

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

    // 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);
}

1 个答案:

答案 0 :(得分:0)

Render Queue使用canvas,你可能也应该使用50k元素。不幸的是,d3 v3不支持画布。如果您可以升级到v4,那么您将获得画布支持和更高的性能。从概念上讲,你当然可以使用直线进行渐进式渲染,但我不知道Render Queue是否直接支持它。我们最终为我们的产品推出了自己的渐进式渲染器。

预先警告,如果你切换到画布,你将不得不重新考虑如何做你的鼠标事件,因为在画布上,你没有可以附加听众的元素。