#javascript #d3.js #nvd3.js
#javascript #d3.js #nvd3.js
Вопрос:
Я показываю простую диаграмму с использованием nvd3, и я получаю NaN при форматировании из строковой даты. Когда я использую код с явными датами javascript (например, закомментируйте var testdata). график показан правильно. Вот мой код. Но я хотел бы использовать строки, что здесь не так?
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link href="novus-nvd3-153163a/build/nv.d3.css" rel="stylesheet" type="text/css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.2/d3.min.js" charset="utf-8"></script>
<script src="novus-nvd3-153163a/build/nv.d3.js"></script>
<script src="novus-nvd3-153163a/examples/lib/stream_layers.js"></script>
<style>
text {
font: 12px sans-serif;
}
svg {
display: block;
}
html, body, {
margin: 0px;
padding: 0px;
height: 100%;
width: 100%;
}
#chart1 {
width : 600px;
height: 400px;
}
</style>
</head>
<body class='with-3d-shadow with-transitions'>
<div id="chart1" ><svg></svg></div>
<script>
var dates = [new Date(2013,1,1).getTime(), new Date(2014,1,1).getTime(), new Date(2015,1,1).getTime()];
//var testdata = [{"key":"Sales","values":[{"x":dates[0],"y":2972948},{"x":dates[1],"y":2659151},{"x":dates[2],"y":11381859}]},{"key":"Rentability","values":[{"x":dates[0],"y":32.9},{"x":dates[1],"y":30.6},{"x":dates[2],"y":78.5}]}];
var testdata = [{"key":"Sales","values":[{"x":"2013-1-1","y":2972948},{"x":"2014-1-1","y":2659151},{"x":"2015-1-1","y":11381859}]},{"key":"Rentability","values":[{"x":"2013-1-1","y":32.9},{"x":"2014-1-1","y":30.6},{"x":"2015-1-1","y":78.5}]}];
testdata[0].type = "line";
testdata[0].yAxis = 1;
testdata[1].type = "line";
testdata[1].yAxis = 2;
nv.addGraph(function() {
var chart = nv.models.multiChart()
.margin({top: 30, right: 60, bottom: 50, left: 70})
.color(d3.scale.category10().range());
chart.xAxis.tickFormat(function(d) {
console.log(d);
return d3.time.format('%Y')(new Date(d));
});
chart.xAxis.tickValues(dates);
chart.yAxis1.tickFormat(d3.format(',.1f'));
chart.yAxis2.tickFormat(d3.format(',.1f'));
d3.select('#chart1 svg')
.datum(testdata)
.transition().duration(0).call(chart);
return chart;
});
</script>
</body>
</html>
Комментарии:
1. Пожалуйста, просмотрите свое описание. Закомментированная строка выглядит так, как будто она не будет работать, в то время как строка с датами Javascript не закомментирована.
2. Да, спасибо, я закомментировал другую строку.
Ответ №1:
К сожалению, AFAIK nv3d не поддерживает строки в качестве дат. Я столкнулся с той же проблемой несколько месяцев назад.
В основном я вижу здесь два возможных решения:
- Если JavaScript является вашим основным источником данных, используйте
Date.parse()
для преобразования ваших строк в даты JavaScript. - В противном случае, при создании этого JavaScript на сервере, измените код сервера для отображения дат JavaScript.
Чтобы избежать проблем с часовыми поясами, вам следует внимательно прочитать Date.parse()
документацию, например, здесь: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date/parse
Короче говоря, если вы передаете строки в формате ISO Date.parse()
, вы получите значения UTC (если не указан часовой пояс). Это Date.parse("2012-03-02")
может привести к 2012-03-01 23:00:00
или аналогичным эффектам при его визуализации (с использованием настроек вашего местного часового пояса, если вы не находитесь в часовом поясе GMT).
Комментарии:
1. Как ни странно, я уже использую nv3d со строкой в качестве дат в других примерах.
2. Хорошо, почему бы вам не опубликовать это в качестве рабочего примера и здесь? Помогло бы найти, что может быть не так… Насколько я помню, это может работать с некоторыми типами диаграмм, но с другими нет…
3. Это мультиархив, здесь принимаются строковые даты, как вы думаете, мультисхема отличается? Почему некоторые диаграммы будут работать, а другие нет, ведь даты синтаксического анализа не зависят от диаграмм. Я использую множество скриптов для рендеринга материала, я собираюсь создать работающую мультиархивную таблицу со строковыми датами, что займет время.
4. Я думаю, что диаграммы со скалярной осью имеют эту проблему. Диаграммы с различными значениями оси могли бы справиться с этим. Но это много предположений, так как я не работал с nvd3 в течение нескольких месяцев…
5. Я сдаюсь, я буду отправлять даты в миллисекундах, чтобы nv правильно интерпретировал. Тем не менее, нет удовлетворительного ответа на вопрос, почему строковые даты не работают на такого рода диаграммах.