图表JS - 为xAxes使用时间

时间:2017-10-08 02:02:25

标签: javascript jquery time chart.js

我添加了此代码

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

选项但它不起作用。我有什么想法吗?

FIDDLE - > https://jsfiddle.net/o473y9pw/

4 个答案:

答案 0 :(得分:10)

由于你希望将时间用于x轴,你的 labels 数组应该是一个日期/时间字符串数组(labels数组对应于x轴)。

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

<强>更新

如果您只有最小和最大日期,则可以创建一个漂亮的小plugin来动态填充data (日期)数组,如下所示:< / p>

labels

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

ᴡᴏʀᴋɪɴɢ ᴇxᴀᴍᴘʟᴇ
(出于演示目的,我已将时间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); } } }] 更改为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);
            }
         }
      }]
   });

});

答案 1 :(得分:4)

数据集应该是一个对象数组,其属性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

答案 2 :(得分:1)

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

db.getCollection("shop").aggregate([
    {$sort: {"price":-1}},
    {$limit: 1},
    {$lookup: {
        from: "shop",
        localField: "price",
        foreignField: "price",
        as: "tmpCollection"
    }},
    {$unwind: "$tmpCollection"},
    {$replaceRoot: {newRoot:"$tmpCollection"}}
]);

如果 xAxis标签与您使用的数字一样使用

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

答案 3 :(得分:1)

您可能想要改变一些事情。

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

  2. 如果您将比例单位设置为CONTACT ContactDTO [userId=123456, contactName=TEST, phones={phone1=12345}] ,则最小最大值应超过一个月才能看到实际比例。

  3. 这是简化的工作示例。

    https://jsfiddle.net/f2xmkkao/