Bar chart race

Cities re-rank month by month with a ticker.

Why it matters dedicated barRace type: FLIP re-ranking with names that never cross, counting ticker, number countUp, reduced-motion snap; images are optional (not shown)

Chart type
Bar Race barRace
Tier
Free Core
Collection
Bar
Render
Live, site theme
View .md Agent setup
LIVE/bar/horizontal-bar-race12 of 12 in Bar

Configuration

Raw Standalone
const options = {
  chart: {
    height: 380,
    fontFamily: "Inter, Geist, \"IBM Plex Sans\", system-ui, sans-serif",
    type: "barRace",
    toolbar: {
      show: false
    }
  },
  series: [
    {
      name: "Active users (k)",
      data: [
        {
          x: "Lisbon",
          y: 53
        },
        {
          x: "Oslo",
          y: 56
        },
        {
          x: "Seattle",
          y: 74
        },
        {
          x: "Osaka",
          y: 68
        },
        {
          x: "Austin",
          y: 78
        },
        {
          x: "Porto",
          y: 59
        },
        {
          x: "Tallinn",
          y: 67
        },
        {
          x: "Lyon",
          y: 54
        },
        {
          x: "Bergen",
          y: 28
        },
        {
          x: "Denver",
          y: 60
        }
      ]
    }
  ],
  plotOptions: {
    barRace: {
      maxBars: 8,
      ticker: {
        text: "Jan 2026"
      },
      values: {
        formatter: (v) => v.toFixed(1) + 'k'
      }
    }
  },
  title: {
    text: "Active users by city, top 8"
  },
  theme: {
    mode: "light",
    preset: "coastal"
  }
}

const chart = new WestCoastCharts(document.querySelector('#chart'), options)
chart.render()