Я создаю график, который использует шкалу времени. Мне бы хотелось, чтобы на оси X было показано время, начиная с нуля и начиная с интервала в 5 секунд каждый.
--------------------------------
:00 :05 :10 :15 :20 :25 :30
Мои данные имеют временные метки, которые приводятся к объектам даты. Шкалы основаны на этих временных метках.
(Примечание: я использую d3 v4 / 5).
D3 имеет изящную функцию для отображения временных интервалов, но эти интервалы начинаются со времени в объектах данных.
Я мог бы конвертировать свои данные, чтобы все время начиналось с нуля, но это могло бы создать дополнительные проблемы, поскольку я выстраиваю несколько наборов данных в одном и том же масштабе времени. Мне интересно, есть ли более элегантный способ использовать одну из функций форматирования тиков для отображения тиков, отличных от масштаба, или для вычисления на лету, чтобы начать с нуля секунд.
Заранее спасибо.
РЕДАКТИРОВАТЬ: Вот более полный фрагмент кода.
var videoData = [{
"id": "1",
"user_id": "_jlxvt8445494296",
"video_id": "test",
"time": "2018-09-11 15:39:20",
"metric": "4"
},
{
"id": "2",
"user_id": "_jlxvt8445494296",
"video_id": "test",
"time": "2018-09-11 15:39:26",
"metric": "2"
},
{
"id": "3",
"user_id": "_jlxvt8445494296",
"video_id": "test",
"time": "2018-09-11 15:39:27",
"metric": "3"
},
{
"id": "4",
"user_id": "_jlxvt8445494296",
"video_id": "test",
"time": "2018-09-11 15:39:38",
"metric": "1"
}
];
var svg = d3.select("svg"),
width = 400,
height = 200;
var parseTime = d3.timeParse("%Y-%m-%d %H:%M:%S");
//coerce to d3 timeParse object
videoData.forEach(function(d) {
d.time = parseTime(d.time);
});
var x = d3.scaleTime()
.rangeRound([0, width])
.domain(d3.extent(videoData, function(d) {
return d.time;
}));
var y = d3.scaleLinear()
.rangeRound([height, 0])
.domain(d3.extent(videoData, function(d) {
return d.metric;
}));
var line = d3.line()
.x(function(d) {
return x(d.time);
})
.y(function(d) {
return y(d.metric);
})
.curve(d3.curveBasis);
svg.append("g")
.attr("transform", "translate(10," + height + ")")
.call(d3.axisBottom(x).tickFormat(d3.timeFormat(":%S")));
svg.append("path")
.datum(videoData)
.attr("fill", "none")
.attr("stroke", "steelblue")
.attr("d", line);
<script src="https://d3js.org/d3.v5.min.js"></script>
<svg width="420" height="220"></svg>