JavaScript Charts: So erstellst du beeindruckende Live-Diagramme

lukas-blazek-mcSDtbWXUZU-unsplash

JavaScript Charts ermöglichen es, Daten interaktiv und in Echtzeit zu präsentieren. In diesem Artikel erfährst du, wie du mit dynamischen Diagrammen und Live-Charts dein Dashboard oder Infoboard aufwertest und deine Nutzer immer up-to-date hältst.

Solche Real Time Charts finden häufig Einsatz in Dashboards, um Entwicklungen von z.B. Temperaturen oder Preisen anzuzeigen. Es gibt zahlreiche Einsatzmöglichkeiten für diese JavaScript Charts. Folgenden Graphen werden wir in diesem Tutorial nachbauen:

Live Charts Beispiel mit 2 Properties

Ich zeige dir hier, die du diese Live Chart erstellen kannst. Es aktualisiert sich alle 100 Millisekunden und zeigt zufällige Daten an. Im produktiven Einsatz kann es Daten aus einer Datenbank oder direkt von einem Sensor auslesen und anzeigen.

Doch damit nicht genug. Der gleiche Code lässt sich mit minimalen Anpassungen auch auf viele andere Diagramm Typen anwenden. Dazu sind nur kleine Anpassungen notwendig. Hier eine Liste der möglichen Diagramme:

Mögliche Google Chart Diagramme
Mögliche Google Chart Diagramme

Google Chart API – Kurze Einführung

Die Google Chart API ist ein kostenfreier Service von Google, der es uns ermöglicht verschiedene Charts, Graphen und Diagramme in unserer Website oder Webanwendung darzustellen.

Zusätzlich bieten die Charts interaktive Funktionen für den Nutzer. Beispielsweise kann man beim Hovern ein Pop-up mit den Werten des aktuellen Elementes angezeigt bekommen.

Die Daten werden statisch angezeigt. Wir entwickeln aber drum herum unser eigenes System, damit wir die Daten in einem gewissen Intervall updaten können, und somit unsere Live Chart erhalten. Die Daten werden dann (quasi) live in Echtzeit geupdatet und der gewünschte Effekt entsteht.

1. Google Chart API einbinden

Die Google Chart API muss über diesen script-Tag eingebunden werden. Ein lokales Hosting ist hier nicht möglich, da Googles Terms of Service das untersagen. Den script Tag fügst du einfach vor dem schließenden body Tag ein.

<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>

2. HTML Container anlegen

Als nächstes benötigen wir ein einfaches div. Dort zeichnet die Google API später das Chart als SVG oder VML.

<div id="chart_div"></div>

3. Google Chart API initialisieren und konfigurieren

Im folgenden Code laden wir das Liniendiagramm Paket aus den Google Chart Packages. Anschließend rufen wir die Funktion drawChart() als Callback auf. Diese wird ausgeführt, sobald die API vollständig geladen wurde.

// load current chart package
google.charts.load("current", {
  packages: ["corechart", "line"]
});

// set callback function when api loaded
google.charts.setOnLoadCallback(drawChart);

Als nächstes erstellen wir ein Objekt mit Label (werden nicht angezeigt) und Default Daten für die Chart. Außerdem benötigen wir ein Array mit Optionen. Hier wird der Titel und die Achsen Beschriftung eingestellt.

Alle Parameter findest du detailliert in der Google Chart Dokumentation.

Danach wählen wir unseren HTML Container aus und lassen mit chart.draw(data, options) die Chart zeichnen.

function drawChart() {

  // create data object with default value
  let data = google.visualization.arrayToDataTable([
    ['Time', 'CPU Usage', 'RAM'],
    [0, 0, 0],
  ]);

  // create options object with titles, colors, etc.
  let options = {
    title: "CPU Usage",
    hAxis: {
      textPosition: 'none',
    },
    vAxis: {
      title: "Usage"
    }
  };

  // draw chart on load
  let chart = new google.visualization.LineChart(
    document.getElementById("chart_div")
  );
  chart.draw(data, options);
}

Mit dem bisherigen Code wird die Tabelle nun schon gezeichnet und wir können einen ersten Blick darauf werden.

Einfaches Liniendiagramm ohne Daten - Erstellt mit der Google Chart API
Einfaches Liniendiagramm ohne Daten – Erstellt mit der Google Chart API

4. Daten in Echtzeit (live) updaten

Nun kommen wir zum wichtigsten Teil, wieso du überhaupt hier bist – das dynamische Live Updaten der Daten in Echtzeit. Damit „erschaffen“ wir unsere Live Chart. Wir fügen in einem Intervall von 100ms (also 10x pro Sekunde) neue Daten in die Chart ein.

Die Variable index dient dazu, ein weiteres Element als Zeile einzufügen und hat keine weitere Bedeutung. Die Variable maxDatas gibt an, wie viele Datenzeilen maximal angezeigt werden. Damit entsteht der Effekt, dass immer nur die 50 neusten Datensätze angezeigt werden.

In diesem Beispiel generiere ich Zufallszahlen, welche als CPU Usage und RAM Usage verstanden werden sollen. Hier musst du in Zeile 8 und 9 deine eigenen Daten einfügen. Das kannst du z.B. über einen Ajax Request machen. Du kannst also über PHP und eine Datenbank Klasse Daten direkt aus deiner Datenbank auslesen oder du schreibst eine eigene RestAPI, z.B. mit Node.js.

// max amount of data rows that should be displayed
let maxDatas = 50;

// interval for adding new data every 250ms
let index = 0;
setInterval(function () {
  // instead of this random, you can make an ajax call for the current cpu usage or what ever data you want to display
  let randomCPU = Math.random() * 20;
  let randomRAM = Math.random() * 50 + 20;

  if (data.getNumberOfRows() > maxDatas) {
    data.removeRows(0, data.getNumberOfRows() - maxDatas);
  }

  data.addRow([index, randomCPU, randomRAM]);
  chart.draw(data, options);

  index++;
}, 100);

Hier nun nochmal der komplette Code in einer Datei. Zur Übersichtlichkeit habe ich alles in eine Datei gepackt. Du solltest JavaScript und CSS allerdings in extra Dateien auslagern.

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
    <style>
      #chart_div {
        width: 1200px;
      }

      body {
        display: flex;
        justify-content: center;
        align-items: center;
      }
    </style>
  </head>

  <body>
    <!-- CONTAINER FOR CHART -->
    <div id="chart_div"></div>
    <script
      type="text/javascript"
      src="https://www.gstatic.com/charts/loader.js"
    ></script>
    <script>
      // load current chart package
      google.charts.load('current', {
        packages: ['corechart', 'line'],
      });

      // set callback function when api loaded
      google.charts.setOnLoadCallback(drawChart);

      function drawChart() {
        // create data object with default value
        let data = google.visualization.arrayToDataTable([
          ['Time', 'CPU Usage', 'RAM'],
          [0, 0, 0],
        ]);

        // create options object with titles, colors, etc.
        let options = {
          title: 'CPU Usage',
          hAxis: {
            textPosition: 'none',
          },
          vAxis: {
            title: 'Usage',
          },
        };

        // draw chart on load
        let chart = new google.visualization.LineChart(
          document.getElementById('chart_div')
        );
        chart.draw(data, options);

        // max amount of data rows that should be displayed
        let maxDatas = 50;

        // interval for adding new data every 250ms
        let index = 0;
        setInterval(function () {
          // instead of this random, you can make an ajax call for the current cpu usage or what ever data you want to display
          let randomCPU = Math.random() * 20;
          let randomRAM = Math.random() * 50 + 20;

          if (data.getNumberOfRows() > maxDatas) {
            data.removeRows(0, data.getNumberOfRows() - maxDatas);
          }

          data.addRow([index, randomCPU, randomRAM]);
          chart.draw(data, options);

          index++;
        }, 100);
      }
    </script>
  </body>
</html>

Andere Diagrammarten verwenden (Donut, Bar, Gauge, …)

Wie bereits zu Beginn angekündigt lassen sich mit wenig Aufwand die Daten auch in andere Charts überführen.

Bei diesen Beispielen müssen die jeweils rot-markierten Zeilen angepasst werden.

Gauge Chart

Dynamische Gauge Chart
// load current chart package
google.charts.load('current', {
  packages: ['corechart', 'gauge'],
});

// set callback function when api loaded
google.charts.setOnLoadCallback(drawChart);

function drawChart() {
  // create data object with default value
  let data = google.visualization.arrayToDataTable([
    ['CPU Usage', 'RAM'],
    [35, 50],
  ]);

  // create options object with titles, colors, etc.
  let options = {
    title: 'CPU Usage',
    hAxis: {
      textPosition: 'none',
    },
    vAxis: {
      title: 'Usage',
    },
    redFrom: 90,
    redTo: 100,
    yellowFrom: 75,
    yellowTo: 90,
    minorTicks: 5,
  };

  // draw chart on load
  let chart = new google.visualization.Gauge(
    document.getElementById('chart_div')
  );
  chart.draw(data, options);

  // max amount of data rows that should be displayed
  let maxDatas = 50;

  // interval for adding new data every 250ms
  let index = 0;
  setInterval(function () {
    // instead of this random, you can make an ajax call for the current cpu usage or what ever data you want to display
    let randomCPU = Math.random() * 20 + 20;
    let randomRAM = Math.random() * 50 + 40;

    if (data.getNumberOfRows() > maxDatas) {
      data.removeRows(0, data.getNumberOfRows() - maxDatas);
    }

    data.setValue(0, 0, randomCPU);
    data.setValue(0, 1, randomRAM);
    chart.draw(data, options);

    index++;
  }, 1000);
}

Bar Chart

Dynamische Bar Chart
// load current chart package
google.charts.load('current', {
  packages: ['corechart', 'line'],
});

// set callback function when api loaded
google.charts.setOnLoadCallback(drawChart);

function drawChart() {
  // create data object with default value
  let data = google.visualization.arrayToDataTable([
    ['Unit', 'Value', { role: 'style' }],
    ['CPU Usage', 1, 'gold'],
    ['RAM', 1, 'silver'],
  ]);

  // create options object with titles, colors, etc.
  let options = {
    title: 'CPU Usage',
    hAxis: {
      textPosition: 'none',
    },
    vAxis: {
      title: 'Usage',
    },
  };

  // draw chart on load
  let chart = new google.visualization.BarChart(
    document.getElementById('chart_div')
  );
  chart.draw(data, options);

  // max amount of data rows that should be displayed
  let maxDatas = 50;

  // interval for adding new data every 250ms
  let index = 0;
  setInterval(function () {
    // instead of this random, you can make an ajax call for the current cpu usage or what ever data you want to display
    let randomCPU = Math.random();
    let randomRAM = Math.random() * 10;

    if (data.getNumberOfRows() > maxDatas) {
      data.removeRows(0, data.getNumberOfRows() - maxDatas);
    }

    data.setValue(1, 1, randomCPU);
    data.setValue(1, 1, randomRAM);
    chart.draw(data, options);

    index++;
  }, 1000);
}

Pie/Donut Chart

Dynamische Pie/Donut Chart
// load current chart package
google.charts.load('current', {
  packages: ['corechart', 'line'],
});

// set callback function when api loaded
google.charts.setOnLoadCallback(drawChart);

function drawChart() {
  // create data object with default value
  let data = google.visualization.arrayToDataTable([
    ['Unit', 'Value'],
    ['CPU Usage', 1],
    ['RAM', 1],
  ]);

  // create options object with titles, colors, etc.
  let options = {
    title: 'CPU Usage',
    hAxis: {
      textPosition: 'none',
    },
    vAxis: {
      title: 'Usage',
    },
  };

  // draw chart on load
  let chart = new google.visualization.PieChart(
    document.getElementById('chart_div')
  );
  chart.draw(data, options);

  // max amount of data rows that should be displayed
  let maxDatas = 50;

  // interval for adding new data every 250ms
  let index = 0;
  setInterval(function () {
    // instead of this random, you can make an ajax call for the current cpu usage or what ever data you want to display
    let randomCPU = Math.random();
    let randomRAM = Math.random();

    if (data.getNumberOfRows() > maxDatas) {
      data.removeRows(0, data.getNumberOfRows() - maxDatas);
    }

    data.setValue(1, 1, randomCPU);
    data.setValue(1, 1, randomRAM);
    chart.draw(data, options);

    index++;
  }, 1000);
}

Um aus der Pie Chart eine Donut Chart zu machen, musst du nur noch den Parameter pieHole mit dem Wert 0.2 in das options Objekt einfügen.

Die Google Chart API kann noch viel, viel mehr! Eine umfangreiche Dokumentation findest du hier.

Ähnliche Beiträge
Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

bold italic underline strikeThrough
insertOrderedList insertUnorderedList outdent indent
removeFormat
createLink unlink
code

Das könnte dich auch interessieren