Recharts: Turn off background hover for bar charts

David Yeiser picture David Yeiser · Jan 23, 2019 · Viewed 7.8k times · Source

Is there a way to turn off this gray background that appears on hover for bar charts in Recharts?

Screenshot of bar chart with gray background appearing behind bars.

Using version 1.4.1. Code (simplified) looks like this:

import React from "react"

// Recharts
import { Bar, BarChart, CartesianGrid, ResponsiveContainer, Tooltip, XAxis, YAxis } from "recharts"

import CustomTooltip from "../CustomTooltip"

const BarChart = ({ chartData, chartInfo }) => (
  <ResponsiveContainer width="99%" height={260}>
    <BarChart data={chartData}>
      <XAxis
        dataKey="label"
        type="category"
        allowDuplicatedCategory={true}
        tickLine={false}
        orientation="bottom"
      />

      <YAxis
        tickLine={false}
        orientation="left"
        axisLine={false}
      />

      <Tooltip
        isAnimationActive={false}
        separator={": "}
        content={<CustomTooltip />}
      />

      <CartesianGrid vertical={false} />

      {chartInfo.map(bar => (
        <Bar
          key={bar.dataKey}
          name={bar.name}
          dataKey={bar.dataKey}
          isAnimationActive={false}
        />
      ))}
    </BarChart>
  </ResponsiveContainer>
)

export default BarChart

I've poured over the API docs as well as looking through the source code. Doesn't seem to be a way to do it, but some of the demos have it disabled, like this one.

I tried setting up mine with custom shapes like that demo and rendering with Cell instead of Bar, but the background was still there on hover. The background color is #ccc but searching the repository with that keyword yielded no clear methods or props to try to override or hook into.

Answer

Ionut picture Ionut · Jan 23, 2019

You can use the cursor prop on the <Tooltip /> to achieve what you need:

<Tooltip cursor={{fill: '#f00'}} />

Here's a working fiddle I made based on some example from their docs.

You can simply use transparent as a value for the fill property.

const {BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend} = Recharts;
const data = [
      {name: 'Page A', uv: 4000, pv: 2400, amt: 2400},
      {name: 'Page B', uv: 3000, pv: 1398, amt: 2210},
      {name: 'Page C', uv: 2000, pv: 9800, amt: 2290},
      {name: 'Page D', uv: 2780, pv: 3908, amt: 2000},
      {name: 'Page E', uv: 1890, pv: 4800, amt: 2181},
      {name: 'Page F', uv: 2390, pv: 3800, amt: 2500},
      {name: 'Page G', uv: 3490, pv: 4300, amt: 2100},
];
const SimpleBarChart = React.createClass({
	render () {
  	return (
    	<BarChart width={600} height={300} data={data}
            margin={{top: 5, right: 30, left: 20, bottom: 5}}>
       <CartesianGrid strokeDasharray="3 3"/>
       <XAxis dataKey="name"/>
       <YAxis/>
       <Tooltip cursor={{fill: 'transparent'}}/>
       <Legend />
       <Bar dataKey="pv" fill="#8884d8" />
       <Bar dataKey="uv" fill="#82ca9d" />
      </BarChart>
    );
  }
})

ReactDOM.render(
  <SimpleBarChart />,
  document.getElementById('container')
);
body {
  margin: 0;
}

#container {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  padding: 10px;
  width: 800px;
  height: 800px;
  background-color: #fff;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.24/browser.js"></script>
<script src="https://npmcdn.com/[email protected]/dist/react-with-addons.min.js"></script>
<script src="https://npmcdn.com/[email protected]/dist/react-dom.min.js"></script>
<script src="https://npmcdn.com/[email protected]/prop-types.min.js"></script>
<script src="https://npmcdn.com/[email protected]/umd/Recharts.min.js"></script>

<div id="container">
  <!-- This element's contents will be replaced with your component. -->
</div>