坚持使用D3 V3变焦行为文档

时间:2013-01-14 12:18:49

标签: d3.js zoom

我是D3库的新手,我在图表上放大了。

我在几张图上正确显示了我的数据。但是当我放大时,一切都会出错。我不知道我是否遗漏了域名或范围或其他任何东西......所以我问。

您可以在此处找到我的代码演示: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("-"));
}

有人可以告诉我这段代码的错误吗?

我应该重新设计一下吗?

如果我使用大量数据,那么预览是否存在性能问题?我应该怎么做?

2 个答案:

答案 0 :(得分: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轴是时间。

答案 1 :(得分:1)

这可能很有用,适用于最新版本的d3: http://bl.ocks.org/3892928