Population Explorer in JavaScript

Using ApexCharts with JavaScript

This Population Explorer example uses ApexCharts.js directly in JavaScript, with no wrapper component.

Install it with npm install apexcharts, then mount the chart with new ApexCharts(element, options).render().

JavaScript installation guide
// Shared by the vanilla-js, React and Vue builds. A synthetic population model:
// as the minimum age rises, the crowd shrinks and the female share dips. Each
// dot is one person; colour is gender; the female minority nests in the centre
// of the packed blob. Dragging the slider re-buckets the data and the dots
// redistribute in place, they do not rebuild from scratch.
function countsForAge(minAge) {
  var frac = (90 - minAge) / 45 // 1 at age 45, 0 at age 90
  var total = Math.round(180 + 760 * frac)
  var femaleShare = 0.2 + 0.16 * frac
  var female = Math.round(total * femaleShare)
  return { female: female, male: total - female, total: total }
}

function readoutText(minAge) {
  var c = countsForAge(minAge)
  var pct = ((c.female / c.total) * 100).toFixed(1)
  return (
    c.total.toLocaleString() +
    ' people aged ' +
    minAge +
    '+, ' +
    c.female.toLocaleString() +
    ' female (' +
    pct +
    '%)'
  )
}

var options = {
  series: [338, 602],
  chart: {
    id: 'popChart',
    type: 'unit',
    height: 460,
    animations: {
      enabled: true,
      speed: 700,
    },
  },
  labels: ['Female', 'Male'],
  colors: ['#EE5A8F', '#1AA5A0'],
  legend: {
    position: 'bottom',
  },
  plotOptions: {
    unit: {
      layout: 'packed',
      sortByGroup: true,
      spacing: 1.1,
    },
  },
}

var chart = new ApexCharts(document.querySelector('#chart'), options)
chart.render()

// countsForAge and readoutText live in the shared head script.
var ageInput = document.querySelector('#age')
var readout = document.querySelector('#readout')

ageInput.addEventListener('input', function () {
  var minAge = parseInt(ageInput.value, 10)
  readout.textContent = readoutText(minAge)
  var c = countsForAge(minAge)
  chart.updateSeries([c.female, c.male])
})