<template>
  <div>
    <div id="chart">
      <apexchart
        type="heatmap"
        height="350"
        :options="chartOptions"
        :series="series"
      ></apexchart>
    </div>
  </div>
</template>

<script>
import VueApexCharts from 'vue-apexcharts'

// Seeded PRNG so the heatmap is identical on every load (stable snapshots).
var __seed = 0x22b3d4e5
function rand() {
  __seed |= 0
  __seed = (__seed + 0x6d2b79f5) | 0
  var t = Math.imul(__seed ^ (__seed >>> 15), 1 | __seed)
  t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t
  return ((t ^ (t >>> 14)) >>> 0) / 4294967296
}

function generateData(count, yrange) {
  var i = 0
  var series = []
  while (i < count) {
    var x = (i + 1).toString()
    var y = Math.floor(rand() * (yrange.max - yrange.min + 1)) + yrange.min

    series.push({
      x: x,
      y: y,
    })
    i++
  }
  return series
}

export default {
  components: {
    apexchart: VueApexCharts,
  },
  data: function () {
    return {
      series: [
        {
          name: 'Jan',
          data: generateData(20, {
            min: -30,
            max: 55,
          }),
        },
        {
          name: 'Feb',
          data: generateData(20, {
            min: -30,
            max: 55,
          }),
        },
        {
          name: 'Mar',
          data: generateData(20, {
            min: -30,
            max: 55,
          }),
        },
        {
          name: 'Apr',
          data: generateData(20, {
            min: -30,
            max: 55,
          }),
        },
        {
          name: 'May',
          data: generateData(20, {
            min: -30,
            max: 55,
          }),
        },
        {
          name: 'Jun',
          data: generateData(20, {
            min: -30,
            max: 55,
          }),
        },
        {
          name: 'Jul',
          data: generateData(20, {
            min: -30,
            max: 55,
          }),
        },
        {
          name: 'Aug',
          data: generateData(20, {
            min: -30,
            max: 55,
          }),
        },
        {
          name: 'Sep',
          data: generateData(20, {
            min: -30,
            max: 55,
          }),
        },
      ],
      chartOptions: {
        chart: {
          height: 350,
          type: 'heatmap',
        },
        plotOptions: {
          heatmap: {
            shadeIntensity: 0.5,
            radius: 0,
            useFillColorAsStroke: true,
            colorScale: {
              ranges: [
                {
                  from: -30,
                  to: 5,
                  name: 'Freezing',
                  color: '#2E5CB8',
                },
                {
                  from: 6,
                  to: 20,
                  name: 'Cold',
                  color: '#4FC3F7',
                },
                {
                  from: 21,
                  to: 45,
                  name: 'Mild',
                  color: '#FFB200',
                },
                {
                  from: 46,
                  to: 55,
                  name: 'Hot',
                  color: '#E53935',
                },
              ],
              // Render the discrete ranges as a smooth gradient strip instead of the
              // categorical legend. Hovering a band highlights the cells in that range
              // and dims the rest; hovering a cell slides the arrow to its value.
              gradientLegend: {
                enabled: true,
                width: '80%',
                thickness: 10,
                showHoverValue: true,
              },
            },
          },
        },
        dataLabels: {
          enabled: false,
        },
        stroke: {
          width: 1,
        },
        title: {
          text: 'Daily Temperature by Month (°C)',
        },
        legend: {
          position: 'top',
        },
      },
    }
  },
}
</script>

<style>
#chart {
  max-width: 650px;
  margin: 35px auto;
}
</style>
Color Range - Vue Heatmap Charts | ApexCharts.js | ApexCharts.js