Search code examples
javascriptchart.jsreact-chartjsreact-chartjs-2chartjs-2.6.0

Is there anyway to overlap one barchart with another in chart js without stacking them?


I tried using the stack and offset but it does not seem to work

This is my code:

import React, {
  useEffect
} from 'react';
import {
  Bar
} from 'react-chartjs-2';
import useWindowWidth from 'wa-shared/src/hooks/useWindowWidth';

const state = {
  count: 0,
  data: {
    labels: [
      ['Total Users'],
      ['Users with', 'Active', 'Session'],
      ['Created 1', 'or More', 'Videos'],
      ['Shared 1', 'or More', 'Videos']
    ],
    datasets: [{
        backgroundColor: '#26863D',
        data: [70, 66, 57, 1],
        barThickness: '35',
      },
      {
        backgroundColor: '#F2F2F2',
        data: [70, 70, 70, 70],
        borderRadius: '5',
        barThickness: '35',
      }
    ]
  }
}

const App = ({}) => {
  const width = useWindowWidth();
  useEffect(() => {});
  return ( <
    div className = 'singlebar-chart'
    id = "barchart" >
    <Bar> data = {
      state.data
    }
    options = {
      {
        scales: {
          x: {
            grid: {
              display: false,
            },
            offset: true,
            ticks: {
              maxRotation: 0,
              minRotation: 0,
              font: {
                size: 8,
              }
            },
          },
          y: {
            min: 0,
            max: 100,
            ticks: {
              fontColor: '#8A8A8A',
              font: {
                size: 8,
              },
              stepSize: 25,
              callback: function(value) {
                return value + "%"
              },
            },
            scaleLabel: {
              display: true,
              labelString: "Percentage",
            },
            grid: {
              display: false,
            }
          }
        },
        plugins: {
          legend: {
            display: false,
          },
        }
      }
      </Bar>
    </div>
  )
}

export default App;
.singlebar-chart{
    width: 95%;
}

Solution

  • You can use a second x axis and map the other dataset to that axes:

    var options = {
      type: 'bar',
      data: {
        labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
        datasets: [{
            label: '# of Votes',
            data: [12, 19, 3, 5, 2, 3],
            backgroundColor: 'pink'
          },
          {
            label: '# of Points',
            data: [7, 11, 5, 8, 3, 7],
            backgroundColor: 'orange',
            xAxisID: 'x2'
          }
        ]
      },
      options: {
        scales: {
          x: {},
          x2: {
            display: false // Dont show the axes since it is just a duplicate
          }
        }
      }
    }
    
    var ctx = document.getElementById('chartJSContainer').getContext('2d');
    new Chart(ctx, options);
    <body>
      <canvas id="chartJSContainer" width="600" height="400"></canvas>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.8.0/chart.js"></script>
    </body>

    Although this gives the exect same result as setting stacked true on the x axis.