gpt4 book ai didi

javascript - d3.js - 时间尺度上均匀分布的条形

转载 作者:行者123 更新时间:2023-12-03 03:24:58 25 4
gpt4 key购买 nike

我正在 d3.js 中构建一个条形图,其中每个条形代表一个月内的结核病病例总数。数据本质上由一个日期(最初是 %Y-%m 格式的字符串,但使用 d3.time.format.parse 进行解析)和一个整数组成。我希望 Axis 标签相对灵活(仅显示年份边界、每月标签等),但我也希望条形间隔均匀。

当我使用日期刻度时,我可以获得灵活的 Axis 标签:

var xScaleDate = d3.time.scale()
.domain(d3.extent(thisstat, function(d) { return d.date; }))
.range([0, width - margin.left - margin.right]);

...但由于每个月的天数不同,条形分布不均匀(例如,二月和三月明显比其他月份更接近)。我可以使用线性比例得到均匀分布的条形:

var xScaleLinear = d3.scale.linear()
.domain([0, thisstat.length])
.range([0, width - margin.left - margin.right]);

...但我不知道如何拥有基于日期的 Axis 标签。我尝试同时使用两个刻度,并且仅从 xScaleDate 生成一个轴,只是为了看看会发生什么,但刻度自然不会完全正确对齐。

有没有一种简单的方法可以实现我所缺少的?

最佳答案

您可以组合序数尺度和时间尺度:

// Use this to draw x axis
var xScaleDate = d3.time.scale()
.domain(d3.extent(thisstat, function(d) { return d.date; }))
.range([0, width - margin.left - margin.right]);

// Add an ordinal scale
var ordinalXScale = d3.scale.ordinal()
.domain(d3.map(thisstat, function(d) { return d.date; }))
.rangeBands([0, width], 0.4, 0);

// Now you can use both of them to space columns evenly:
columnGroup.enter()
.append("rect")
.attr("class", "column")
.attr("width", ordinalXScale.rangeBand())
.attr("height", function (d) {
return height - yScale(d.value);
})
.attr("x", function (d) {
return xScaleDate(d.date);
})
.attr("y", function (d){
return yScale(d.value);
});

我不久前创建了一个示例来演示这种方法:http://codepen.io/coquin/pen/BNpQoO

关于javascript - d3.js - 时间尺度上均匀分布的条形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12186366/

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