在 D3.js 的时间滑块中逐月递增
Incrementing month by month in a time slider with D3.js
我有一个 ASP.NET 应用程序,我正在其中使用 D3.js。
我有一个可以显示在我的网页上的时间滑块,我想逐月增加它。
但是,我用的方法,只能按天来做。
这是我的代码。
var MinDate = formatDate_t( new Date(Math.min(...dates)));
var MaxDate = formatDate_t(new Date(Math.max(...dates)));
// MinDate and MaxDate came from my database.
var interval = (new Date(MaxDate)).getFullYear() - (new Date(MinDate)).getFullYear() + 2;
console.log(interval);
var dataTime = d3.range(0, interval).map(function (d) {
return new Date(((new Date(MinDate)).getFullYear()) + d, 0, 1);
});
var sliderTime = d3
.sliderBottom()
.min(d3.min(dataTime))
.max(d3.max(dataTime))
.step(1000 * 60 * 60 * 24 * 30)
.width(800)
.tickFormat(d3.timeFormat('%b-%Y'))
.tickValues(dataTime)
.default([new Date(MinDate), new Date(MaxDate)])
var gTime = d3
.select('div#slider-time')
.append('svg')
.attr('width', 1250)
.attr('height', 100)
.append('g')
.attr('transform', 'translate(30,30)');
在“.step(1000 * 60 * 60 * 24 * 30)”这一行,我想每个月精确递增一次,而不是每 30 天递增一次。
可能吗?
感谢您的帮助。
当您需要滑块捕捉到不等距的值时,您应该使用 slider.marks
而不是 slider.step
。在您的示例中,在您的时间间隔内创建一个月份数组,并将它们用作 slider.marks
.
的输入
const minDate = new Date('1998-01-11'),
maxDate = new Date('2021-12-17'),
interval = maxDate.getFullYear() - minDate.getFullYear() + 1,
startYear = minDate.getFullYear();
let dataMonths = [];
for (let year = 0; year < interval; year++) {
for (let month = 0; month < 12; month++) {
dataMonths.push(new Date(startYear + year, month, 1));
}
}
const sliderTime = d3
.sliderBottom()
.min(d3.min(dataMonths))
.max(d3.max(dataMonths))
.marks(dataMonths)
.width(500)
.tickFormat(d3.timeFormat('%b %Y'))
.tickValues(dataMonths.filter(d => d.getMonth === 0))
.default(minDate);
const gTime = d3
.select('div#slider-time')
.append('svg')
.attr('width', 600)
.attr('height', 100)
.append('g')
.attr('transform', 'translate(30,30)');
gTime.call(sliderTime);
<script src="https://d3js.org/d3.v6.min.js"></script>
<script src="https://unpkg.com/d3-simple-slider"></script>
<div id="slider-time"></div>
我有一个 ASP.NET 应用程序,我正在其中使用 D3.js。
我有一个可以显示在我的网页上的时间滑块,我想逐月增加它。
但是,我用的方法,只能按天来做。
这是我的代码。
var MinDate = formatDate_t( new Date(Math.min(...dates)));
var MaxDate = formatDate_t(new Date(Math.max(...dates)));
// MinDate and MaxDate came from my database.
var interval = (new Date(MaxDate)).getFullYear() - (new Date(MinDate)).getFullYear() + 2;
console.log(interval);
var dataTime = d3.range(0, interval).map(function (d) {
return new Date(((new Date(MinDate)).getFullYear()) + d, 0, 1);
});
var sliderTime = d3
.sliderBottom()
.min(d3.min(dataTime))
.max(d3.max(dataTime))
.step(1000 * 60 * 60 * 24 * 30)
.width(800)
.tickFormat(d3.timeFormat('%b-%Y'))
.tickValues(dataTime)
.default([new Date(MinDate), new Date(MaxDate)])
var gTime = d3
.select('div#slider-time')
.append('svg')
.attr('width', 1250)
.attr('height', 100)
.append('g')
.attr('transform', 'translate(30,30)');
在“.step(1000 * 60 * 60 * 24 * 30)”这一行,我想每个月精确递增一次,而不是每 30 天递增一次。
可能吗?
感谢您的帮助。
当您需要滑块捕捉到不等距的值时,您应该使用 slider.marks
而不是 slider.step
。在您的示例中,在您的时间间隔内创建一个月份数组,并将它们用作 slider.marks
.
const minDate = new Date('1998-01-11'),
maxDate = new Date('2021-12-17'),
interval = maxDate.getFullYear() - minDate.getFullYear() + 1,
startYear = minDate.getFullYear();
let dataMonths = [];
for (let year = 0; year < interval; year++) {
for (let month = 0; month < 12; month++) {
dataMonths.push(new Date(startYear + year, month, 1));
}
}
const sliderTime = d3
.sliderBottom()
.min(d3.min(dataMonths))
.max(d3.max(dataMonths))
.marks(dataMonths)
.width(500)
.tickFormat(d3.timeFormat('%b %Y'))
.tickValues(dataMonths.filter(d => d.getMonth === 0))
.default(minDate);
const gTime = d3
.select('div#slider-time')
.append('svg')
.attr('width', 600)
.attr('height', 100)
.append('g')
.attr('transform', 'translate(30,30)');
gTime.call(sliderTime);
<script src="https://d3js.org/d3.v6.min.js"></script>
<script src="https://unpkg.com/d3-simple-slider"></script>
<div id="slider-time"></div>