gpt4 book ai didi

d3.js - d3 : Make tick marks on d3. svg.axis 可拖动?

转载 作者:行者123 更新时间:2023-12-05 05:27:56 25 4
gpt4 key购买 nike

我想将 d3.svg.axis 重新用于需要刻度线较大且可拖动的用途:

axis

例如上面the axis whose code is here的截图中,我希望当您将鼠标悬停在 25 或 69 上时鼠标变为四角形状,然后可以通过按住鼠标单击来左右拖动刻度线。

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

axis code

所以我假设有一种方法可以定位这些元素并使它们响应拖动,但我不清楚该怎么做。当然,线元素不能随意拖动,只能沿水平轴左右滑动,不能超出开始和结束刻度。

最佳答案

我得到了这个工作: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);

关于d3.js - d3 : Make tick marks on d3. svg.axis 可拖动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15348616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com