import React from 'react'
import ReactApexChart from 'react-apexcharts'
import './styles.css'

// 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
}

const ApexChart = () => {
  const [state, setState] = React.useState({
    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,
        }),
      },
    ],
    options: {
      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',
      },
    },
  })

  return (
    <div>
      <div id="chart">
        <ReactApexChart
          options={state.options}
          series={state.series}
          type="heatmap"
          height={350}
        />
      </div>
    </div>
  )
}

export default ApexChart
Color Range - React Heatmap Charts | ApexCharts.js | ApexCharts.js