d3:在d3.svg.axis上打勾是否可以拖动?

时间:2013-03-11 21:05:57

标签: d3.js

我想重新调整d3.svg.axis的用途,以便使得刻度线变大且可拖动:

axis

例如,在上面the axis whose code is here的屏幕截图中,当你将鼠标悬停在25或69上时,我希望鼠标变为四角形状,然后能够拖动刻度线左键和右键通过按住鼠标左键。

我可以看到d3自动生成的<svg>代码为每个类别为“tick”的tick生成一个单独的<line>元素:

axis code

所以我假设有一种方法来定位这些元素并让它们响应拖动,但我不清楚如何做到这一点。当然,线元素不应该在任何地方可拖动,而应该只沿水平轴左右滑动,并且不能移动到开始和结束刻度之外。

1 个答案:

答案 0 :(得分:2)

我得到了这个工作:livecoding.io example

这里有相关的代码,不是特别干净但有效:

var w = h = 600;
var padding = 20;
var svg = d3.select("svg").attr("width", w).attr("height", h);

var xScale = d3.scale.linear()
             .domain([0, 100])
             .range([padding, w - padding * 2]);

var sharedAxis = function() {
  return d3.svg.axis()
            .scale(xScale)
            .tickValues([19,69])
            .tickSize(50);
}

var downAxis = sharedAxis()
            .orient("bottom");

var upAxis = sharedAxis()
            .orient("top");

var addPlayer = function(playerAxis) {
  svg.append("g")
   .attr("class", "axis")
   .attr("transform", "translate(0," + (100) + ")")
   .call(playerAxis);
}


addPlayer(downAxis);
addPlayer(upAxis);

var drag = d3.behavior.drag()
    .on("drag", dragmove);

function dragmove(d) {
  // move it
  var curX = d3.select(this).attr("transform").match(/\(([^,]+),/)[1];
  var newX = Math.max(xScale.range()[0], d3.event.x);
  newX = Math.min(xScale.range()[1], newX);
  var newTransform = d3.select(this).attr("transform").replace(/\([^,]+,/, "(" + newX + ",");
  d3.select(this).attr("transform", newTransform);
  // update text
  d3.select(this).select("text").text(parseInt(xScale.invert(newX)));
}

var allTicks = d3.selectAll(".axis g").call(drag);