У меня проблема с использованием графических данных осадков D3 из API погоды.
Столбцы смещены относительно отметок примерно на треть дня или 8 часов.Я думаю, что это как-то связано с часовыми поясами.API возвращает дату только в формате «гггг-мм-дд», без связи с часовым поясом.Таким образом, когда я преобразую его в объект даты (т.е. новую дату (d.date)), он устанавливает его в GMT или часовой пояс Тихого океана.Но кажется, что галочки находятся в другом часовом поясе.
Нужно ли где-нибудь запускать преобразование часового пояса?Если да, то как?
Если нет, почему мои бары смещены?
Я хочу, чтобы тики читались в формате "мм / дд", а подсказка - в "гггг / мм / дд ".
Вот как выглядит проблема на графике:
Вот данные, с которыми мне нужно работать (ключпары значений, возвращаемые из API):
И вот весь мой код d3, который находится внутри компонента Angular 6:
ngAfterViewInit() {
function timeConverter(UNIX_date) {
var a = new Date(UNIX_date);
// var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
var months = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'];
var year = a.getFullYear();
var month = months[a.getMonth()];
var date = a.getDate()+1;
var time = month + '/' + date ;
// var time = date + ' ' + month + ' ' + year + ' ' + hour + ':' + min + ':' + sec ;
return time;
}
this.check = true;
var svg = d3.select("#" + this.input_id)
var margin = { top: 20, right: 20, bottom: 30, left: 0 }
if (window.screen.width < 1000) { // 768px portrait
var width = 1000 - margin.left - margin.right
}
if (window.screen.width >= 1000) { // 768px portrait
var width = parseInt(d3.select("#" + this.input_id).style("width")) - margin.left - margin.right
}
var height = 80 - margin.top - margin.bottom,
barPadding = 5,
barWidth = (width / (this.data2.length));
//cpmvert time for the data
this.data2.forEach(function (d) {
d.date = timeConverter(d.timestamp)
});
var g = svg.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
var x = d3.scaleBand().rangeRound([0, width]).padding(0.1)
.domain(this.data2.map(function (d) { return d['date']; }));
var y = d3.scaleLinear().rangeRound([height, 0])
.domain(<[Date, Date]>d3.extent(this.data2, function (d) { return d['precipitation']; }))
const tip = d3Tip()
tip.attr("class", "d3-tip")
.style("background-color", '#f2f5f8')
.style("padding", "10px")
.style("color", "#0c2a47")
.style("border", "1px solid #c3c3c3")
.style("border-radius", "4px")
tip.html(d => {
return ("<strong>Date:</strong>" + "<br>" + d['timestampUtc'] + "<br>" + "<strong>Precipitation: </strong>" + d['precipitation'] + " inches")
})
svg.call(tip)
g.selectAll(".bar")
.data(this.data2)
.enter().append("rect")
.attr("class", "bar")
.attr("x", function (d) { return x(d['date' ]); })
.attr("y", function (d) { return y(d['precipitation']); })
.attr("width", barWidth - barPadding)
.attr("height", function (d) { return height - y(d['precipitation']); })
.attr("fill", "#b2ddf0")
.attr("margin-left", "20px")
.on("mouseover", function (d) {
tip.show(d, this);
})
.on('mouseout', function (d) { tip.hide(); })
var xaxis = d3.axisBottom(x)
.tickPadding(10).tickFormat((domainn,number)=>{return ""});
svg.append("g")
.attr("transform", "translate(0," + 50 + ")")
.attr("fill", "#3c3c3c")
.call(d3.axisBottom(x))
}
Кстати, причина, по которой я запускаю функцию 'timeConverter', заключается в том, чтобы переформатировать тик, чтобы не включать год.Подсказка читает из другого ключа, включая год.Я добавил +1 к дате, так как она почему-то отстала от дня.
Любая и вся помощь очень ценится!Дайте мне знать, что вы думаете.Спасибо!