Введите текст в многослойную диаграмму пончиков

#reactjs #recharts

Вопрос:

Я использую recharts для визуализации некоторых диаграмм с PieChart помощью и Pie . Это многослойная диаграмма пончиков. Я хочу ввести текст метки в каждом разделе диаграммы. Когда я вызываю метку в окне PieChart , она показывает мне числовые значения за пределами диаграммы пончиков. Я хочу ввести текст внутри диаграммы пончиков.

 import React from 'react';
import { PieChart, Pie } from 'recharts';

export default function App() {
  const data01 = [
    {
      "name": "Group A",
      "value": 2400
    },
    {
      "name": "Group B",
      "value": 4567
    },
    {
      "name": "Group C",
      "value": 1398
    },
    {
      "name": "Group D",
      "value": 9800
    },
    {
      "name": "Group E",
      "value": 3908
    },
    {
      "name": "Group F",
      "value": 2000
    }
  ];
  const data02 = [
    {
      "name": "Group A",
      "value": 1000,
      "fill": "#77D970"
    },
    {
      "name": "Group B",
      "value": 1000,
      "fill": "#77D970"
    },
    {
      "name": "Group C",
      "value": 1000,
      "fill": "#77D970"
    },
    {
      "name": "Group D",
      "value": 1000,
      "fill": "#77D970"
    },
    {
      "name": "Group E",
      "value": 1000,
      "fill": "#77D970"
    },
    {
      "name": "Group F",
      "value": 1000,
      "fill": "#4B6587",
      "uv": "21"
    }
  ];
  const data03 = [
    {
      "name": "Group A",
      "value": 1000
    },
    {
      "name": "Group B",
      "value": 1000
    },
    {
      "name": "Group C",
      "value": 1000
    },
    {
      "name": "Group D",
      "value": 1000
    },
    {
      "name": "Group E",
      "value": 1000
    },
    {
      "name": "Group F",
      "value": 1000
    }
  ];
  const data04 = [
    {
      "name": "Group A",
      "value": 1000,
    },
    {
      "name": "Group B",
      "value": 1000
    },
    {
      "name": "Group C",
      "value": 1000
    },
    {
      "name": "Group D",
      "value": 1000
    },
    {
      "name": "Group E",
      "value": 1000
    },
    {
      "name": "Group F",
      "value": 1000
    }
  ];
  const data05 = [
    {
      "name": "Group A",
      "value": 1000
    },
    {
      "name": "Group B",
      "value": 1000
    },
    {
      "name": "Group C",
      "value": 1000
    },
    {
      "name": "Group D",
      "value": 1000
    },
    {
      "name": "Group E",
      "value": 1000
    },
    {
      "name": "Group F",
      "value": 1000
    }
  ];
  const data06 = [
    {
      "name": "Group A",
      "value": 1000,
    },
    {
      "name": "Group B",
      "value": 1000
    },
    {
      "name": "Group C",
      "value": 1000
    },
    {
      "name": "Group D",
      "value": 1000
    },
    {
      "name": "Group E",
      "value": 1000
    },
    {
      "name": "Group F",
      "value": 1000
    }
  ];
  const data07 = [
    {
      "name": "Group A",
      "value": 1000,
    },
    {
      "name": "Group B",
      "value": 1000,
    },
    {
      "name": "Group C",
      "value": 1000,
    },
    {
      "name": "Group D",
      "value": 1000,
    },
    {
      "name": "Group E",
      "value": 1000,
    },
    {
      "name": "Group F",
      "value": 1000,
    }
  ];

  return (
    <div>
      <PieChart width={1000} height={800}>
        {/* <Pie data={data01} dataKey="value" nameKey="name" cx="50%" cy="50%" innerRadius={40} outerRadius={60} fill="#8884d8" /> */}
        <Pie data={data02} dataKey="value" nameKey="name" cx="50%" cy="50%" innerRadius={50} outerRadius={70} />
        <Pie data={data03} dataKey="value" nameKey="name" cx="50%" cy="50%" innerRadius={70} outerRadius={90} fill="#77D970" />
        <Pie data={data04} dataKey="value" nameKey="name" cx="50%" cy="50%" innerRadius={90} outerRadius={110} fill="#77D970" />
        <Pie data={data05} dataKey="value" nameKey="name" cx="50%" cy="50%" innerRadius={110} outerRadius={130} fill="#77D970" />
        <Pie data={data06} dataKey="value" nameKey="name" cx="50%" cy="50%" innerRadius={130} outerRadius={150} fill="#D5D5D5" />
        <Pie data={data07} dataKey="value" nameKey="name" cx="50%" cy="50%" innerRadius={150} outerRadius={170} fill="#4B6587" label />
      </PieChart>
    </div>
  );
}
 

Это мой код. Это многослойная диаграмма пончиков.

Ответ №1:

Из rechart документации:

Если установлено значение false, метки рисоваться не будут. Если установлено значение true, будут нарисованы метки, для которых реквизиты рассчитаны внутри. Если объект задан, будут нарисованы метки, в которых реквизиты объединены с помощью внутренне рассчитанных реквизитов и опции. Если задан параметр ReactElement, этот параметр может быть элементом пользовательской метки. Если задать функцию, она будет вызвана для отображения настроенной метки.

Таким образом, вы можете передать пользовательский компонент react для рендеринга с label реквизитами:

Вы можете создать свою собственную пользовательскую метку и импортировать ее в App компонент, вот пример:

 const renderCustomizedLabel = ({ cx, cy, midAngle, innerRadius, outerRadius, percent, index }) => {
  const radius = innerRadius   (outerRadius - innerRadius) * 0.5;
  const x = cx   radius * Math.cos(-midAngle * (Math.PI / 180));
  const y = cy   radius * Math.sin(-midAngle * (Math.PI / 180));

  return (
    <text x={x} y={y} fill="white" textAnchor={x > cx ? 'start' : 'end'} dominantBaseline="central">
      {`${(percent * 100).toFixed(0)}%`}
    </text>
  );
};
 

Теперь передайте renderCustomizedLabel label свойство в Pie элементе:

 <Pie
  data={data02} 
  dataKey="value"
  nameKey="name" 
  cx="50%" 
  cy="50%" 
  innerRadius={50}  
  outerRadius={70}
  label={renderCustomizedLabel}
  labelLine={false}
/>
 

Примечание: Также установите labelLine false значение, чтобы игнорировать рисование линии для отображения метки.