javascript - 无法在 d3 散点图的 x 轴上显示日期
问题描述
使用以下代码,我创建了两个版本的日期值(一个是字符串progressDateString
,另一个是日期类型,progressDate
):
var parseTime = d3.timeParse("%d-%b-%y");
var formatTime = d3.timeFormat("%d-%b-%y");
data = d3.csvParse(data, function (d) {
return {
progress: d.Progress,
progressDate: parseTime(d.ProgressDate),
//Fri Jul 12 2019 00:00:00 GMT+0200
progressDateString: formatTime(parseTime(d.ProgressDate)),
//12-Jul-19
};
});
我想12-Jul-19
用下面的代码在 x 轴上显示日期格式,但是它不打印日期值
const xScale = d3.scaleLinear()
.range([0, width])
.domain([d3.min(data, d => { return d.progressDateString }), d3.max(data, d => { return d.progressDateString })]);
但是,相反,如果我使用progressDate
,我会得到以下图表,其中所有内容都在 x 轴上重叠:
任何想法,为什么我不能让它progressDateString
有价值?在这篇文章中,它似乎应该工作。我很感激任何帮助。
以防万一它可能有帮助,我在下面分享整个代码:
var parseTime = d3.timeParse("%d-%b-%y");
var formatTime = d3.timeFormat("%d-%b-%y");
data = d3.csvParse(data, function (d) {
return {
progress: d.Progress,
progressDate: parseTime(d.ProgressDate),
progressDateString: formatTime(parseTime(d.ProgressDate)),
};
});
console.log(data[2].progressDate);
const height = 300,
width = 400,
margins = { top: 20, right: 100, bottom: 50, left: 50 };
const chart = d3.select('.chart')
.attr('width', width + margins.left + margins.right)
.attr('height', height + margins.top + margins.bottom)
.append('g')
.attr('transform', 'translate(' + margins.left + ',' + margins.top + ')');
const xScale = d3.scaleLinear()
.range([0, width])
.domain([d3.min(data, d => { return d.progressDate }), d3.max(data, d => { return d.progressDate })]);
const yScale = d3.scaleLinear()
.range([0, height])
.domain([d3.max(data, d => { return d.progress }), 0]);
const dots = chart.selectAll('dot')
.data(data)
.enter().append('circle')
.attr('r', 5)
.attr('cx', d => { return xScale(d.progressDate); })
.attr('cy', d => { return yScale(d.progress) })
.style('fill', 'indianred');
chart.selectAll('text')
.data(data)
.enter().append('text')
.text(d => { return d.Name; })
.attr('x', d => { return xScale(d.progressDate); })
.attr('y', d => { return yScale(d.progress); })
.attr('transform', 'translate(10,5)');
chart.append('g')
.attr('transform', 'translate(0,' + height + ')')
.call(d3.axisBottom(xScale));
chart.append('g')
.call(d3.axisLeft(yScale));
chart.append('text')
.style('font-size', '14px')
.style('text-anchor', 'middle')
.attr('x', width / 2)
.attr('y', height + 50)
.text('Seconds Behind Fastest Time')
chart.append('text')
.style('font-size', '14px')
.style('text-anchor', 'middle')
.attr('x', height / -2)
.attr('y', -30)
.attr('transform', 'rotate(-90)')
.text('Ranking')
解决方案
使用scaleTime
而不是scaleLinear
成功了。我希望它可以帮助某人。
推荐阅读
- javascript - javascript中的函数参数来自哪里?
- git - 以编程方式检查 git 是否有新版本,如果然后拉
- perl - 使用 perlbrew 创建全新的一次性安装 perl 的最快、最便宜的方法?
- ios - 我可以在需要时在屏幕底部显示 UIView 并在其顶部显示键盘吗?
- javascript - 为什么重新定义变量不会在异步函数中引发错误
- python - 如何遍历由 getter 或 @property 定义的对象的属性?
- java - 这两种从 LocalDateTime 创建 DateTime 的方法有什么区别?
- perl - 如何拆分多个文件名并在输出中获取姓氏
- laravel - Laravel:`php artisan app:name MyApp` 导致异常:内核不存在
- javascript - 当函数稍后出现错误时,console.log 不起作用