代码之家  ›  专栏  ›  技术社区  ›  Sergino

x轴标签的位置与折线图数据点不同步

  •  0
  • Sergino  · 技术社区  · 6 年前

    我有这个图表设置:

    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轴标签的位置与折线图数据点不同步。我需要帮助。

    1 回复  |  直到 6 年前
        1
  •  0
  •   uminder    6 年前

    问题是 date 值对应于一个月的最后一天。我添加了这个函数 toFirstDayOfMonth 在代码示例中进一步转换数据以获得预期结果。

    function toFirstDayOfMonth(dateString) {
      const date = new Date(dateString);
      date.setDate(1);
      return 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>
    推荐文章