gpt4 book ai didi

javascript - 如何在页面中心对齐 d3.linearScale()?

转载 作者:太空狗 更新时间:2023-10-29 16:34:24 25 4
gpt4 key购买 nike

我正在尝试创建一个原点位于 svg 中心的二维笛卡尔坐标系。基本上是这样的: How I'd like to have it...我目前的方法是平移轴,使它们的原点在中间。

  // Add the x Axis
svg.append("g")
.attr("transform", "translate(" + 0 + "," + height/2 + ")")
.call(d3.axisBottom(x).ticks(100));

// Add the y Axis
svg.append("g")
.attr("transform", "translate(" + width/2 + "," + 0 + ")")
.call(d3.axisLeft(y).ticks(100));
});

但是我需要手动调整范围以使 y 轴居中。每个屏幕尺寸所需的值都不同,这就是为什么我需要帮助弄清楚如何始终让我的坐标轴在每个屏幕上居中。

  var x = d3.scaleLinear().range([width/2-5*width,width/2+5*width]).domain([-50, 50]); 
var y = d3.scaleLinear().range([height/2-5*height,height/2+3.244*width]).domain([50, -50]); //the value 3.244 is the problem, it changes on every screen

我创建了一个 Fiddle ,以便向您展示我是如何精确地创建坐标轴的。

最佳答案

我没有遵循所有这些复杂且不必要的数学(例如,在您原来的 fiddle 中,您为什么使用魔数(Magic Number)?没有它它也能工作:https://jsfiddle.net/smftm5sv/)。

将笛卡尔平面的原点设置在 SVG 的中心非常简单。首先,您可以按照自己的方式定义范围……最简单的选项就是:

var x = d3.scaleLinear().range([0, width]);
var y = d3.scaleLinear().range([0, height]);

其次,要在笛卡尔平面中对齐两个轴,只需将比例的零值传递给每个平移(y(0)x(0)) .这甚至适用于 xy 轴的不同域,前提是起始值和结束值具有相同的绝对值:

svg.append("g")
.attr("transform", "translate(0"," + y(0) + ")")
.call(d3.axisBottom(x));

svg.append("g")
.attr("transform", "translate(" + x(0) + ",0)")
.call(d3.axisLeft(y));

这是进行了这些更改的代码(另外,我正在摆脱 jQuery,您不需要 jQuery 和 D3):

var width = window.innerWidth;
var height = window.innerHeight;
var padding = 10;


var svg = d3.select("body")
.append("svg")
.attr("width", width)
.attr("height", height)
.call(d3.zoom().on("zoom", function() {
svg.attr("transform", d3.event.transform);
}))
.append("g");

var viewport = svg.append('g');

var x = d3.scaleLinear().range([0 + padding, width - padding]).domain([-50, 50]);
var y = d3.scaleLinear().range([0 + padding, height - padding]).domain([50, -50]);

// Add the x Axis
svg.append("g")
.attr("transform", "translate(" + 0 + "," + y(0) + ")")
.call(d3.axisBottom(x));

// Add the y Axis
svg.append("g")
.attr("transform", "translate(" + x(0) + "," + 0 + ")")
.call(d3.axisLeft(y));
<script src="https://d3js.org/d3.v4.min.js"></script>

由于 Stack 片段窗口非常小(并且您动态获取窗口的尺寸),y 轴将非常短,而 x 轴将更长。

关于javascript - 如何在页面中心对齐 d3.linearScale()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47610656/

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