React-chartjs-2:饼图工具提示百分比

IT技术 javascript reactjs pie-chart
2021-05-05 11:03:39

是否可以从React-chartjs-2 库编辑 Piechart 的工具提示以允许它显示百分比而不是默认值预览?

<Pie
   data={this.props.data}
   legend={this.props.legend}
/>

上面链接上的文档不清楚自定义工具提示。

饼形图

我也想启用工具提示来表示百分比,而不是“取消:303 ”以显示类似“取消:303(40%) ”的内容。

3个回答
const data = {
  labels: [
    'MFA',
    'NON-MFA'
  ],
  datasets: [{
    data: [5667, 223829],
    backgroundColor: [
    '#FF6384',
    '#36A2EB'
    ],
    hoverBackgroundColor: [
    '#FF6384',
    '#36A2EB'
    ]
  }]
};

const option = {
  tooltips: {
    callbacks: {
      label: function(tooltipItem, data) {
        var dataset = data.datasets[tooltipItem.datasetIndex];
        var meta = dataset._meta[Object.keys(dataset._meta)[0]];
        var total = meta.total;
        var currentValue = dataset.data[tooltipItem.index];
        var percentage = parseFloat((currentValue/total*100).toFixed(1));
        return currentValue + ' (' + percentage + '%)';
      },
      title: function(tooltipItem, data) {
        return data.labels[tooltipItem[0].index];
      }
    }
  }
}

然后在渲染部分,输入:

<Pie data={data} options={option} />

使用._meta不再对我有用以获得总数。相反,我使用了DemiJiang 的答案并通过以下方式获得了总数:

let total = 0;
for (let i = 0; i < data.datasets.length; i++) {
  total += data.datasets[i].data[tooltipItem.index];
}

所以我label在 TypeScript 中的整个回调看起来像:

static numberWithPercentageLabel(tooltipItem: any, data: any) {
  const dataset = data.datasets[tooltipItem.datasetIndex];
  const currentValue = dataset.data[tooltipItem.index];
  let total = 0;
  for (let i = 0; i < data.datasets.length; i++) {
    total += data.datasets[i].data[tooltipItem.index];
  }
  const percentage = (currentValue / total * 100).toFixed(0);
  return `${currentValue} (${percentage}%)`;
}
tooltips: {
    callbacks: {
        label: (tooltipItem, data) => {
            const dataset = data.datasets[tooltipItem.datasetIndex];
            const meta = dataset._meta[Object.keys(dataset._meta)[0]];
            const total = meta.total;
            const currentValue = tooltipItem?.value;
            const percentage = parseFloat((currentValue/total*100).toFixed(1));
            return currentValue + ' (' + percentage + '%)';
        },
        title: tooltipItem =>
            `${tooltipItem[0]?.label}`
    }
},