webentwicklung-frage-antwort-db.com.de

Chart JS - Zeit für xAxes verwenden

ich habe diesen Code hinzugefügt

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

zu den optionen funktioniert es aber nicht. Irgendwelche Ideen, was ich falsch mache?

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

8
Peter

Da Sie time für die x-Achse verwenden möchten, sollte Ihr labels -Array ein Array aus Datums-/Zeitzeichenfolge sein (labels-Array entspricht der x-Achse).

Sie müssen auch parser property (um Datum/Uhrzeit korrekt zu analysieren) und x-Achse ' ticks source auf data(um X-Achsen-Ticks richtig zu generieren).

UPDATE

Wenn Sie nur ein Min- und Max-Datum haben, können Sie ein Nice little plugin erstellen, um das Array labels(date) dynamisch zu füllen, und zwar als solches:

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);
      }
   }
}]

note:moment.js wird verwendet, um Berechnungen zu vereinfachen.

ᴡᴏʀᴋɪɴɢ ᴇxᴀᴍᴘʟᴇ
(zu Demonstrationszwecken habe ich die Zeit unit in day geändert)

$(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/[email protected]/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>

9
ɢʀᴜɴᴛ

Das Dataset sollte ein Array von Objekten mit den Eigenschaften x für Zeit und y für Wert sein. Wie könnten Sie sonst die Karte zeichnen, oder?

$(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
Gökhan Kurt

Vielleicht möchten Sie ein paar Dinge ändern.

  1. Ihre Daten sollten time - Daten enthalten.

  2. Wenn Sie die Skaleneinheit auf month einstellen, sollte Ihr Mindestwert mehr als einen Monat betragen, um die tatsächlichen Skalen anzuzeigen.

Hier ist ein vereinfachtes Arbeitsbeispiel.

https://jsfiddle.net/f2xmkkao/

1
Lee Han Kyeol

Wenn das Label xAxis im Datumsformat vorliegt, verwenden Sie diesen Code

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

Wenn das Label xAxis so ist, wie es mit Zahlen verwendet wird 

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