2013-01-14 39 views
1

我是D3库的新手,我在图形上缩放。卡住D3 V3缩放行为文档

我在几张图上正确显示了我的数据。但是当我缩放时,一切都出错了。我不知道如果我错过了域或范围或任何东西......所以我问。

你可以找到我的代码在这里演示:http://pastehtml.com/view/cos13vodt.html

这里是的jsfiddle例如:http://jsfiddle.net/84mSQ/

而我的JS代码有:

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

//To parse dates as they are into the CSV 
var parseDate = d3.time.format("%Y/%m/%d-%H:%M").parse; 

var format = d3.time.format("%d/%m/%y-%H:%M"); 

var x = d3.time.scale() 
    .range([0, width]); 

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

var color = d3.scale.category10(); 

var xAxis = d3.svg.axis().scale(x) 
    .orient("bottom"); 

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

var zoom = d3.behavior.zoom() 
    .x(x) 
    .scaleExtent([1, 2]) 
    .on("zoom", function(scale, translate){ 
     console.log("fonction zoom"); 
     console.log(scale); console.log(translate); 
     zoomed(scale, translate); 
    }); 

// A line generator. 
var line = d3.svg.line() 
    .interpolate("basis") 
    .x(function(d) { return x(d.date); }) 
    .y(function(d) { return y(d.value); }); 


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

svg.append("rect") 
    .attr("class", "pane") 
    .attr("width", width) 
    .attr("height", height); 

// Get the data 
d3.csv("./enregistrement-subset2.csv", function(data) { 
    color.domain(d3.keys(data[0]) 
    .filter(function(key) { 
     return key !== "date" && key !== "ECS - Button A" ; 
    })); 

    data.forEach(function(d) { 
     //Parse the date 
     d.date = parseDate(d.date); 
    }); 

    var dataSet = color.domain().map(function(name) { 

     return { 
      name: name, 
      values: data.map(function(d) { 
       //parses the number by using the '+' operator 
       if(name == "CO2 chambre"){ 
        return { date: d.date, value: (+d[name])/10}; 
       } 
       else{ 
        return { date: d.date, value: +d[name]}; 
        } 
      }) 
     }; 
    }); 

    // Scale the range of the data 
    x.domain(d3.extent(data, function(d) { return d.date; })); 
    y.domain([ 
     d3.min(dataSet, function(c) { var mini = d3.min(c.values, function(v) { return v.value; }); return mini; }), 
     d3.max(dataSet, function(c) { var maxi = d3.max(c.values, function(v) { return v.value; }); return maxi; }) 
     ]); 

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

    svg.append("g") 
      .attr("class", "y axis") 
      .call(yAxis) 
     .append("text") 
      .attr("transform", "rotate(-90)") 
      .attr("y", 6) 
      .attr("dy", ".71em") 
      .style("text-anchor", "end") 
      .text("Value of"); 

    var valueSet = svg.selectAll(".valueSet") 
      .data(dataSet) 
     .enter().append("g") 
      .attr("class", "valueSet"); 

    valueSet.append("path") 
     .attr("class", "line") 
     .attr("d", function(d) { return line(d.values); }) 
     .style("stroke", function(d) { return color(d.name); }) 
     .call(line); 

    valueSet.append("text") 
     .datum(function(d) { return {name: d.name, value: d.values[d.values.length - 1]}; }) 
     .attr("transform", function(d) { return "translate(" + x(d.value.date) + "," + y(d.value.value) + ")"; }) 
     .attr("x", 3) 
     .attr("dy", ".35em") 
     .text(function(d) { return d.name; }); 

    //zoomed(); 

}); 

function zoomed() { 
    console.log("here", d3.event); 

    svg.select("g.x.axis").call(xAxis); 
    svg.select("g.y.axis").call(yAxis); 
    //svg.selectAll("path.line").call(line); 
    svg.selectAll("path.line").attr("d", line); 
    //d3.select("#footer span").text("Période de temps: " + x.domain().map(format).join("-")); 
} 

任何人能告诉我是什么这个代码我做错了吗?

我应该重新设计吗?

如果我使用大量数据并且我应该怎么做,是否有性能问题需要预览?

+0

当你问这样的问题时,你应该为你的例子创建一个[jsFiddle](http://jsfiddle.net/)。它让回答问题的人更容易看到您的代码示例正在运行且可以轻松编辑。 – seliopou

+0

要是我能帮助多少,而是看这个线程: http://stackoverflow.com/questions/12409955/setting-x-domain-with-setinterval –

+0

@seliopou谢谢,我编辑的职位增加jsFiddle链接 – lauhub

回答

1

这可能是有用的,可与最新版本的D3的: http://bl.ocks.org/3892928

+0

谢谢。其实我已经在我的代码中使用它了。但是我找不到明确的文档介绍如何做到这一点,并添加绘制图形的线条。我研究了你所做的代码,但是我对所做的一切都有些迷失。你有关于这个的其他文件吗?即使只是链接到您研究的文档? – lauhub

+0

对不起,有关缩放和平移的文档不是很好(与我的英语一样糟糕),我可以帮助我学到了什么,我的第一个建议是看你的代码改变日期格式为纪元时间( http://en.wikipedia.org/wiki/Unix_time)。 –

2
var zoom = d3.behavior.zoom() 
    .x(x) 
    **.scaleExtent([1, 2])** <--- 
    .on("zoom", function(scale, translate){ 
     console.log("fonction zoom"); 
     console.log(scale); console.log(translate); 
     zoomed(scale, translate); 
    }); 

取出.scaleExtent([1,2]),并检查其是否工作


应该

var zoom = d3.behavior.zoom() 
    .x(x) 
    .on("zoom", function(scale, translate){ 
     console.log("fonction zoom"); 
     console.log(scale); console.log(translate); 
     zoomed(scale, translate); 
    }); 

这是因为你的X轴是时间。

+0

感谢您的回答。自从我尝试完成这项工作已经很长时间了。我现在没有太多时间来测试,但我会在下周检查一下。 – lauhub