0👍
You have to use state variable to save data for charts and onclick of legend modifiy the state data and send new data to bar chart
Working code link
import React from "react";
import { Bar } from "react-chartjs-2";
const mocked_data = {
labels: ["Brand 1", "Brand 2", "Brand 3", "Brand 4", "Brand 5"],
spend_per_channel: {
spends: [
{
label: "Cinema",
data: [56, 23, 55, 56, 57]
},
{
label: "Retails",
data: [22, 17, 32, 47, 62]
},
{
label: "Fashion",
data: [46, 73, 25, 76, 27]
},
{
label: "Oil",
data: [26, 40, 80, 50, 62]
},
{
label: "Gas",
data: [36, 13, 35, 46, 67]
}
],
sales: [
{
label: "Cinema",
data: [156, 123, 155, 56, 157]
},
{
label: "Retail",
data: [122, 117, 132, 147, 162]
},
{
label: "Fashion",
data: [416, 173, 125, 176, 127]
},
{
label: "Oil",
data: [126, 135, 180, 100, 86]
},
{
label: "Gas",
data: [136, 113, 135, 146, 167]
}
]
}
};
const MyChart = () => {
const CHART_COLORS = [
"#e35b2c",
"#e77235",
"#eb8a40",
"#f0a04b",
"#f5b858",
"#f9cf63",
"#fde76e",
"#fced86",
"#ffffb7",
"#fefeeb"
];
const spendsdata = mocked_data.spend_per_channel.spends.map(
(spend, index) => {
return {
label: spend.label,
backgroundColor: CHART_COLORS[index],
data: spend.data,
hidden: false,
stack: 1
};
}
);
const salesdata = mocked_data.spend_per_channel.sales.map((sale, index) => {
return {
label: sale.label,
backgroundColor: CHART_COLORS[index],
data: sale.data,
hidden: false,
stack: 2
};
});
const newdataset = [spendsdata, salesdata];
const spnedperchanneldata = newdataset.flat();
const [data, setData] = React.useState(spnedperchanneldata);
const options = {
legend: {
position: "bottom",
labels: {
generateLabels: function(chart) {
return Chart.defaults.global.legend.labels.generateLabels
.apply(this, [chart])
.filter(function(item, i) {
return i > 4;
});
},
boxWidth: 10,
usePointStyle: true
},
onClick: (e, legend) => {
onclick(legend);
}
}
};
const onclick = React.useCallback(
legend => {
let newData = data.map(item => {
if (item.label === legend.text) item.hidden = !item.hidden;
return item;
});
setData(newData);
},
[data, setData]
);
return (
<>
<Bar
data={{
labels: ["Brand 1", "Brand 2", "Brand 3", "Brand 4", "Brand 5"],
datasets: data
}}
width={100}
height={50}
options={options}
/>
</>
);
};
export default MyChart;
Source:stackexchange.com