我有此图表设置:
const data = [{
name: "series1",
series: [{
date: "2016-01-31T00:00:00.000Z",
value: 8
},
{
date: "2016-02-28T00:00:00.000Z",
value: 10
},
{
date: "2016-03-30T00:00:00.000Z",
value: 12
},
{
date: "2016-04-31T00:00:00.000Z",
value: 15
},
{
date: "2016-05-31T00:00:00.000Z",
value: 14
},
{
date: "2016-06-30T00:00:00.000Z",
value: 16
},
{
date: "2016-07-31T00:00:00.000Z",
value: 17
}
]
}, {
name: "series2",
series: [{
date: "2016-01-31T00:00:00.000Z",
value: 5
},
{
date: "2016-02-28T00:00:00.000Z",
value: 7
},
{
date: "2016-03-30T00:00:00.000Z",
value: 10
},
{
date: "2016-04-31T00:00:00.000Z",
value: 13
},
{
date: "2016-05-31T00:00:00.000Z",
value: 12
},
{
date: "2016-06-30T00:00:00.000Z",
value: 14
},
{
date: "2016-07-31T00:00:00.000Z",
value: 15
}
]
}];
new Chart(document.getElementById('myChart'), {
type: 'line',
data: {
datasets: [
{
label: data[0].name,
fill: false,
backgroundColor: 'red',
borderColor: 'red',
data: data[0].series.map(x => ({ x: new Date(x.date), y: x.value }))
}, {
label: data[1].name,
fill: false,
backgroundColor: 'green',
borderColor: 'green',
data: data[1].series.map(x => ({ x: new Date(x.date), y: x.value }))
}
]
},
options: {
responsive: true,
title: {
display: false
},
legend: {
display: true,
position: 'top'
},
tooltips: {
mode: 'index',
intersect: true
},
scales: {
xAxes: [{
type: 'time',
time: {
unit: 'month',
displayFormats: {
'month': 'MMM YYYY',
},
tooltipFormat: 'MMM YYYY'
}
}],
}
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.0/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.min.js"></script>
<canvas id="myChart" height="100"></canvas>
问题在于x轴标签的位置与折线图数据点不同步。需要帮助。
答案 0 :(得分:0)
问题在于所有date
值都对应一个月的最后一天。我在您的代码示例中添加了函数toFirstDayOfMonth
,以进一步转换数据以获得预期结果。
function toFirstDayOfMonth(dateString) {
const date = new Date(dateString);
date.setDate(1);
return date;
}
或者,您也可以按以下方式编写此函数,以便仅考虑date
字符串的年份和月份。
function toFirstDayOfMonth(dateString) {
return new Date(dateString.substring(0, 7));
}
请查看修改后的代码。
const data = [{
name: "series1",
series: [{
date: "2016-01-31T00:00:00.000Z",
value: 8
},
{
date: "2016-02-28T00:00:00.000Z",
value: 10
},
{
date: "2016-03-31T00:00:00.000Z",
value: 12
},
{
date: "2016-04-30T00:00:00.000Z",
value: 15
},
{
date: "2016-05-31T00:00:00.000Z",
value: 14
},
{
date: "2016-06-30T00:00:00.000Z",
value: 16
},
{
date: "2016-07-31T00:00:00.000Z",
value: 17
}
]
}, {
name: "series2",
series: [{
date: "2016-01-31T00:00:00.000Z",
value: 5
},
{
date: "2016-02-28T00:00:00.000Z",
value: 7
},
{
date: "2016-03-31T00:00:00.000Z",
value: 10
},
{
date: "2016-04-30T00:00:00.000Z",
value: 13
},
{
date: "2016-05-31T00:00:00.000Z",
value: 12
},
{
date: "2016-06-30T00:00:00.000Z",
value: 14
},
{
date: "2016-07-31T00:00:00.000Z",
value: 15
}
]
}];
function toFirstDayOfMonth(dateString) {
const date = new Date(dateString);
date.setDate(1);
return date;
}
new Chart(document.getElementById('myChart'), {
type: 'line',
data: {
datasets: [
{
label: data[0].name,
fill: false,
backgroundColor: 'red',
borderColor: 'red',
data: data[0].series.map(x => ({ x: toFirstDayOfMonth(x.date), y: x.value }))
}, {
label: data[1].name,
fill: false,
backgroundColor: 'green',
borderColor: 'green',
data: data[1].series.map(x => ({ x: toFirstDayOfMonth(x.date), y: x.value }))
}
]
},
options: {
responsive: true,
title: {
display: false
},
legend: {
display: true
},
tooltips: {
mode: 'x'
},
scales: {
xAxes: [{
type: 'time',
distribution: 'series',
time: {
unit: 'month',
tooltipFormat: 'MMM YYYY'
}
}]
}
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.4.0/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.min.js"></script>
<canvas id="myChart" height="90"></canvas>