【问题标题】:Chart JS - Use time for xAxesChart JS - xAxes 的使用时间
【发布时间】:2020-12-07 08:23:53
【问题描述】:

我添加了这段代码

scales: 
{
        xAxes: 
        [{
            type: 'time',
            time: 
            {
                unit: 'month',
                displayFormats: { month: 'MM' },
                max: '2017-10-09 18:43:53',
                min: '2017-10-02 18:43:53'
            }
        }]
},

到选项,但它不起作用。任何想法我做错了什么?

小提琴 -> https://jsfiddle.net/o473y9pw/

【问题讨论】:

标签: javascript jquery time chart.js


【解决方案1】:

由于您希望将时间用于 x 轴,因此您的 labels 数组应该是日期/时间字符串数组(labels 数组对应于 x 轴)。 p>

您还需要设置parser 属性(以正确解析日期/时间),并将x 轴的ticks source 设置为data (正确生成 x 轴刻度).

更新

如果你只有一个最小和最大日期,你可以创建一个漂亮的小plugin 来动态填充labels (date) 数组,如下所示:

plugins: [{
   beforeInit: function(chart) {
      var time = chart.options.scales.xAxes[0].time, // 'time' object reference
         // difference (in days) between min and max date
         timeDiff = moment(time.max).diff(moment(time.min), 'd');
      // populate 'labels' array
      // (create a date string for each date between min and max, inclusive)
      for (i = 0; i <= timeDiff; i++) {
         var _label = moment(time.min).add(i, 'd').format('YYYY-MM-DD HH:mm:ss');
         chart.data.labels.push(_label);
      }
   }
}]

注意: moment.js 用于简化计算。

ᴡᴏʀᴋɪɴɢ ᴇxᴀᴍᴘʟᴇ
(为了演示,我把时间unit改成了day

$(document).ready(function() {

   new Chart(document.getElementById("chartBox"), {
      type: 'line',
      data: {
         datasets: [{
            data: [12, 19, 3, 5, 2, 3, 32, 15],
            label: "",
            borderWidth: 2,
            borderColor: "#3e95cd",
            fill: false,
            pointRadius: 0
         }]
      },
      options: {
         scales: {
            xAxes: [{
               type: 'time',
               time: {
                  parser: 'YYYY-MM-DD HH:mm:ss',
                  unit: 'day',
                  displayFormats: {
                     day: 'ddd'
                  },
                  min: '2017-10-02 18:43:53',
                  max: '2017-10-09 18:43:53'
               },
               ticks: {
                  source: 'data'
               }
            }]
         },
         legend: {
            display: false
         },
         animation: {
            duration: 0,
         },
         hover: {
            animationDuration: 0,
         },
         responsiveAnimationDuration: 0
      },
      plugins: [{
         beforeInit: function(chart) {
            var time = chart.options.scales.xAxes[0].time, // 'time' object reference
               timeDiff = moment(time.max).diff(moment(time.min), 'd'); // difference (in days) between min and max date
            // populate 'labels' array
            // (create a date string for each date between min and max, inclusive)
            for (i = 0; i <= timeDiff; i++) {
               var _label = moment(time.min).add(i, 'd').format('YYYY-MM-DD HH:mm:ss');
               chart.data.labels.push(_label);
            }
         }
      }]
   });

});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/moment@latest/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.0/Chart.min.js"></script>

<canvas id="chartBox"></canvas>

【讨论】:

  • 问题是我只有一个最小和最大日期。您知道将最小值/最大值转换为“日期数组”的好方法吗?感谢您的快速答复!
  • 是的.. 检查更新的答案。但是,需要注意的一件事是,在您的小提琴中,您拥有的数据多于日期的数量 (最小值和最大值之间的差异) .. 这是出乎意料的。您应该始终拥有与日期相同数量的数据,而不是更多或更少。
  • 这不好:/ ...有什么解决方法的想法吗? Maybee 计算数据数组()而不是创建日期(双)?我知道当有很多日期且空间不足时,chartjs 不会显示每个日期。问题是我需要所有数据(如果不需要,图表不够准确:(
  • 你想要做的是一个解决方法本身,这不是 chart.js 的工作方式。无论如何,你可以简单地增加日期范围 (min/max) i> 取决于您的数据.. 检查this
【解决方案2】:

数据集应该是一个对象数组,其中 x 表示时间,y 表示值。

$(document).ready(function() {
  var data = [{
      x: new moment().add(-10, "months"),
      y: Math.random() * 100
    },
    {
      x: new moment().add(-8, "months"),
      y: Math.random() * 100
    },
    {
      x: new moment().add(-6, "months"),
      y: Math.random() * 100
    },
    {
      x: new moment().add(-4, "months"),
      y: Math.random() * 100
    },
    {
      x: new moment().add(-2, "months"),
      y: Math.random() * 100
    },
    {
      x: new moment().add(-0, "months"),
      y: Math.random() * 100
    },
  ];

  new Chart(document.getElementById("chartBox"), {
    type: 'line',
    data: {
      datasets: [{
        data: data,
        borderColor: "#3e95cd",
        fill: false
      }]
    },
    options: {
      scales: {
        xAxes: [{
          type: 'time'
        }]
      },
      legend: false
    }
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.0/Chart.bundle.min.js"></script>

<canvas id="chartBox"></canvas>

Fiddle

【讨论】:

  • 感谢您的简单示例。大多数文档和示例都非常复杂和糟糕
【解决方案3】:

如果 xAxis 标签是日期格式,请使用此代码

time: 
     {
         format: 'MM',
         unit: 'month',
         displayFormats: { month: 'MM' },
         max: '2017-10-09 18:43:53',
         min: '2017-10-02 18:43:53'
     }

如果 xAxis 标签是你使用的数字,使用

 time:
      {
         format: 'MM',
         unit: 'month',
         parser:'MM',
         displayFormats: { month: 'MM' },
         max: '2017-10-09 18:43:53',
         min: '2017-00-02 18:43:53'
      }

【讨论】:

  • 没用,能给我一个 FIDDLE 的例子吗?
【解决方案4】:

您可能想要更改一些内容。

  1. 您的数据应包含时间数据。

  2. 如果您将比例单位设置为month,则您的最小最大应该超过一个月才能看到实际比例。

这是简化的工作示例。

https://jsfiddle.net/f2xmkkao/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    相关资源
    最近更新 更多