import React, { Component, ReactElement, ReactSVGElement } from 'react'; import { PieChart, Pie, Legend, Cell, Tooltip, ResponsiveContainer, Sector, Label, LabelList } from 'recharts'; import { scaleOrdinal } from 'd3-scale'; import { schemeCategory10 } from 'd3-scale-chromatic'; import { changeNumberOfData } from './utils'; import * as _ from 'lodash'; const colors = scaleOrdinal(schemeCategory10).range(); const data01 = [ { name: 'Group A', value: 400, v: 89 }, { name: 'Group B', value: 300, v: 100 }, { name: 'Group C', value: 200, v: 200 }, { name: 'Group D', value: 200, v: 20 }, { name: 'Group E', value: 278, v: 40 }, { name: 'Group F', value: 189, v: 60 }, ]; const data02 = [ { name: 'Group A', value: 2400 }, { name: 'Group B', value: 4567 }, { name: 'Group C', value: 0 }, { name: 'Group D', value: 9800 }, { name: 'Group E', value: 3908 }, { name: 'Group F', value: 4800 }, ]; const data03 = [ { name: 'A1', value: 100 }, { name: 'A2', value: 300 }, { name: 'B1', value: 100 }, { name: 'B2', value: 80 }, { name: 'B3', value: 40 }, { name: 'B4', value: 30 }, { name: 'B5', value: 50 }, { name: 'C1', value: 100 }, { name: 'C2', value: 200 }, { name: 'D1', value: 150 }, { name: 'D2', value: 50 }, { name: 'E1', value: 200 }, { name: 'E2', value: 34 }, { name: 'E3', value: 44 }, { name: 'F1', value: 89 }, { name: 'F2', value: 49 }, { name: 'F3', value: 51 }, ]; const initialState = { data01, data02, data03 }; const renderLabelContent: React.FunctionComponent = (props: any) => { const { value, percent, x, y, midAngle } = props; return ( = 90) ? 'end' : 'start'}> {`Count: ${value}`} {`(Percent: ${(percent * 100).toFixed(2)}%)`} ); }; const renderActiveShape: React.FunctionComponent = (props: any) => { const RADIAN = Math.PI / 180; const { cx, cy, midAngle, innerRadius, outerRadius, startAngle, endAngle, fill, payload, percent } = props; const sin = Math.sin(-RADIAN * midAngle); const cos = Math.cos(-RADIAN * midAngle); const sx = cx + (outerRadius + 10) * cos; const sy = cy + (outerRadius + 10) * sin; const mx = cx + (outerRadius + 30) * cos; const my = cy + (outerRadius + 30) * sin; const ex = mx + (cos >= 0 ? 1 : -1) * 22; const ey = my; const textAnchor = cos >= 0 ? 'start' : 'end'; return ( {payload.name} = 0 ? 1 : -1) * 12} y={ey} textAnchor={textAnchor} fill="#333"> {`Count ${payload.value}`} = 0 ? 1 : -1) * 12} y={ey} dy={18} textAnchor={textAnchor} fill="#999"> {`(percent: ${(percent * 100).toFixed(2)}%)`} ); }; export default class Demo extends Component { static displayName = 'PieChartDemo'; onPieEnter = (data: any, index: number, e: React.MouseEvent) => { this.setState({ activeIndex: index, }); }; state = { ...initialState, activeIndex: 0, animation: false, }; handleChangeData = () => { this.setState(() => _.mapValues(initialState, changeNumberOfData)); }; handleChangeAnimation = () => { this.setState({ animation: !this.state.animation, }); }; handlePieChartEnter = (a: any, b: number, c: React.MouseEvent) => { console.log(a, b, c); }; handleLeave = () => this.setState({ activeIndex: -1 }); render () { const { data01, data02, data03 } = this.state; return (
change data

Simple PieChart

{ data01.map((entry, index) => ( )) } { data02.map((entry, index) => ( )) }

PieChart with two donut

PieChart wrapped by ResponsiveContainer

PieChart wrapped by ResponsiveContainer

{ data01.map((entry, index) => ( )) }

PieChart has bug about tooltip

{ data01.map((entry, index) => ( )) }
); } }