<!-- 
  default bar height 4(em)
  optional:min,max
 -->
<div class="chart-container">
<canvas class="chart-space"
        data-title="Handbrake H.264 GPU Transcode"
        data-min="0"
        data-max="200"
        data-value-caption="FPS"
        data-values='{"Macbook Pro 2021 M1 Pro(GPU:16Core) ":164.83,"Macbook Pro 2020 M1":100.21,"Macbook Pro 2020 Intel Iris Plus":68.5,"Windows Desktop Intel Core-i5 10400 QSV":116.8}'></canvas>
</div>

<div class="chart-container">
<canvas class="chart-space"
        data-bar-height="8"
        data-title="Handbrake H.264 CPU Transcode"
        data-min="0"
        data-max="200"
        data-value-caption="FPS"
        data-values='{"Macbook Pro 2021 M1 Pro(CPU:10Core) ":72.42,"Macbook Pro 2020 M1":42.94,"Macbook Pro 2020 Intel Iris Plus":32.11,"Windows Desktop Intel Core-i5 10400(6Core/12Threads)":47.6}'></canvas>
</div>
.chart-container{
  position:relative;
  width:100%;
}
(function () {
  // Chart.js Config
  const config = {
    type: "bar",
    data: {},
    options: {
      indexAxis: "y",
      maintainAspectRatio: false,
      plugins: {
        title: {
          display: true,
          font:{
            size:16
          },
          text: ""
        }
      },
      scales:{
        xAxis:{}
      }
    }
  };
  const data = {
    labels: [],
    datasets: [
      {
        axis: "y",
        data: [],
        fill: false,
        backgroundColor: [
          "rgba(255, 99, 132, 0.2)",
          "rgba(255, 159, 64, 0.2)",
          "rgba(255, 205, 86, 0.2)",
          "rgba(75, 192, 192, 0.2)",
          "rgba(54, 162, 235, 0.2)",
          "rgba(153, 102, 255, 0.2)",
          "rgba(201, 203, 207, 0.2)"
        ],
        borderColor: [
          "rgba(255, 99, 132, 0.2)",
          "rgba(255, 159, 64, 0.2)",
          "rgba(255, 205, 86, 0.2)",
          "rgba(75, 192, 192, 0.2)",
          "rgba(54, 162, 235, 0.2)",
          "rgba(153, 102, 255, 0.2)",
          "rgba(201, 203, 207, 0.2)"
        ],
        borderWidth: 1
      }
    ]
  };

  // build Charts
  var charts = document.getElementsByClassName("chart-space");
  for (var i = 0, max = charts.length; i < max; i += 1) {
    var chartEl = charts[i];
    var raw = JSON.parse(chartEl.dataset.values);
    var parent = chartEl.parentElement;
    var title = chartEl.dataset.title;
    var valueCaption = chartEl.dataset.valueCaption;
    var barHeightEm =
      typeof chartEl.dataset.barHeight === "undefined"
        ? 4
        : parseInt(chartEl.dataset.barHeight, 10);
    var __labels = [];
    var __data = [];

    var count = 0;
    for (key in raw) {
      __labels.push(key);
      __data.push(raw[key]);
      count++;
    }

    var _config = JSON.parse(JSON.stringify(config));
    var _data = JSON.parse(JSON.stringify(data));

    parent.style.height = barHeightEm * count + "em";

    _data.labels = __labels;
    _data.datasets[0].data = __data;
    _data.datasets[0].label = valueCaption;
    _config.data = _data;
    _config.options.plugins.title.text = title;
     if(typeof chartEl.dataset.min !== "undefined"){
     _config.options.scales.xAxis['min'] = parseInt(chartEl.dataset.min, 10);
   }
    if(typeof chartEl.dataset.max !== "undefined"){
     _config.options.scales.xAxis['max']= parseInt(chartEl.dataset.max, 10);
   }
    const myChart = new Chart(chartEl, _config);
  }
})();

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.6.0/chart.min.js