reactjsecmascript-6chart.jsreact-chartjs

Zoom and Pan in react-chartjs-2


I have recently implemented chart display using react-chartjs-2 (https://github.com/jerairrest/react-chartjs-2)

I want to enable zooming and panning feature so that it will be more user-friendly in touch based screens. To implement this features, I installed react-hammerjs and chartjs-plugin-zoom.

import {Chart, Line} from 'react-chartjs-2';
import Hammer from 'react-hammerjs';
import zoom from 'chartjs-plugin-zoom'

And I registered the plugin

componentWillMount(){
    Chart.plugins.register(zoom)
}

And the render method goes as follows:

render(){
    return <Line data={data} options={options} />
}

Pan and Zoom options:

pan:{
    enabled=true,
    mode:'x'
},
zoom:{
    enabled:true,
    drag:true,
    mode:'xy'
}

I guess this is the correct method to implement. Unfortunately, the above implementation did not work. I will be really grateful if some of you guys already implemented Zooming and Panning using react-chartjs-2 plugin, please share if how you achieved these functionalities. Or you could point out the problem in my code above.


Solution

  • In order to add Zoom and Pan capabilities to your chart components based on react-chartjs-2, you can follow the steps as shown below:

    Step 1: you need to install chartjs-plugin-zoom

    $ npm install chartjs-plugin-zoom
    

    Step 2: Import chartjs-plugin-zoom in your chart component

    import 'chartjs-plugin-zoom';
    

    Step 3: Enable zoom and pan in the ChartJS component options

            zoom: {
              enabled: true,
              mode: 'x',
            },
            pan: {
              enabled: true,
              mode: 'x',
            },
    

    That's it. So now your chart component should look like this:

    import React from 'react';
    import { Line } from 'react-chartjs-2';
    import 'chartjs-plugin-zoom';
    
    export default function TimelineChart({ dailyDataSets }) {
      const lineChart = dailyDataSets[0] ? (
        <Line
          data={{
            labels: dailyDataSets.map(({ date }) => date),
            datasets: [
              {
                data: dailyDataSets.map((data) => data.attr1),
                label: 'First data set',
                borderColor: 'red',
                fill: true,
              },
              {
                data: dailyDataSets.map((data) => data.attr2),
                label: 'Second data set',
                borderColor: 'green',
                fill: true,
              },
            ],
          }}
          options={{
            title: { display: true, text: 'My Chart' },
            zoom: {
              enabled: true,
              mode: 'x',
            },
            pan: {
              enabled: true,
              mode: 'x',
            },
          }}
        />
      ) : null;
    
      return <div>{lineChart}</div>;
    }
    


    Notes:

    1. You don't have to install hammerjs explicitly, as it will be automatically included by installing chartjs-plugin-zoom as its dependency, see below:
    $ npm ls
    ...
    ├─┬ chartjs-plugin-zoom@0.7.7
    │ └── hammerjs@2.0.8
    ...
    
    1. One way to zoom as an example (at least for Mac), you can move your mouse pointer into the chart area, and then scroll your mouse down or up. Once zoomed in, you can keep your mouse clicked while dragging left or right.