如何仅在x轴线上进行绘图? (d3.js)

时间:2013-12-01 05:58:28

标签: javascript graph d3.js plot

我刚开始尝试使用d3库。

我正在尝试创建一个交互式折线图,人们可以在其中绘制自己的积分。你可以在这里找到它:http://jsfiddle.net/6FjJ2/

我的问题是:如何确保只能在x轴'线上进行绘图? 如果你看看我的例子,你会发现它有点像是有效的,但是有很多作弊行为。查看确定变量......实现此目的的正确方法是什么?我不知道我怎么能用...来实现这一点所以我得到了很多分开的。

   var data = [2, 3, 4, 3, 4, 5],
   w      = 1000,
   h      = 300,

   monthsData = [],
   months     = 18;

   for(i = 0; i < months; i++) {
     monthsData.push(i);
   }

   var max = d3.max(monthsData),
   x = d3.scale.linear().domain([0, monthsData.length]).range([0, w]),
   y = d3.scale.linear().domain([0, max]).range([h, 0]),

   pointpos = [];

   lvl  = [0, 10],
   lvly = d3.scale.linear().domain([0, d3.max(lvl)]).range([h, 0]);

   svg = d3.select(".chart")
           .attr("width", w)
           .attr("height", h);

   svg.selectAll('path.line')
   // Return "data" array which will form the path coordinates
      .data([data])
   // Add path
      .enter().append("svg:path")
      .attr("d", d3.svg.line()
                       .x(function(d, i) { return x(i); })
                       .y(y));

   // Y-axis ticks
   ticks = svg.selectAll(".ticky")
   // Change number of ticks for more gridlines!
              .data(lvly.ticks(10))
                        .enter().append("svg:g")
                        .attr("transform", function(d) { return "translate(0, " +  (lvly(d)) + ")"; })
                        .attr("class", "ticky");

   ticks.append("svg:line")
        .attr("y1", 0)
        .attr("y2", 0)
        .attr("x1", 0)
        .attr("x2", w);

   ticks.append("svg:text")
        .text( function(d) { return d; })
        .attr("text-anchor","end")
        .attr("dy", 2)
        .attr("dx", -4);

   // X-axis ticks
   ticks = svg.selectAll(".tickx")
              .data(x.ticks(monthsData.length))
                                      .enter().append("svg:g")
                                      .attr("transform", function(d, i) { return "translate(" +  (x(i)) + ", 0)"; })
                                      .attr("class", "tickx");

   ticks.append("svg:line")
        .attr("y1", h)
        .attr("y2", 0)
        .attr("x1", 0)
        .attr("x2", 0);

   ticks.append("svg:text")
        .text( function(d, i) { return i; })
        .attr("y", h)
        .attr("dy", 15)
        .attr("dx", -2);

   //   var d = $(".tickx:first line").css({"stroke-width" : "2", opacity : "1"});

   var line;
   var ok = -55;

   svg.on("mousedown", mouseDown)
      .on("mouseup", mouseUp);

   function mouseDown() {
     var m = d3.mouse(this);
     line = svg.append("line")
               .data(monthsData)
     /* .attr("x1", m[0]) */
               .attr("x1", function(d, i) { pointpos.push(m[0]); ok += 55; return ok;})
               .attr("y1", m[1])
               .attr("x2", function(d, i) { return ok + 56; })
     /* .attr("x2", function(d, i) {return 300; }) */
               .attr("y2", m[1]);

     svg.on("mousemove", mouseMove);

     var m = d3.mouse(this);
     var point = svg.append("circle")
                    .attr("cx", function(d, i) { return ok; })
                    .attr("cy", function(d, i) { return m[1]; })
                    .attr("r", 8);

     lvl.push(100);
   }

   function mouseMove() {
     var m = d3.mouse(this);
     line.attr("y2", m[1]);
     /* .attr("y1", m[0]); */
   }

   function mouseUp() {
     // Change null to mousemove for a graph kinda draw mode
     svg.on("mousemove", mouseMove);
   }

请原谅我的错误代码!

提前致谢。

1 个答案:

答案 0 :(得分:1)

看起来你需要:

  1. histogram layout用于分割您的积分。
  2. ordinal scales根据bin
  3. 限制他们的x-axis职位

    作为旁注,您可以使用d3.svg.axis为您绘制轴。