cake-chart
Interactive multi-layer pie chart
Demo
Install
> npm i -S cake-chart Simple Example
import CakeChart from 'cake-chart';  const TREE = {   value: 100,   label: 'SUM = 100',   children: [{     value: 50,     children: [{       value: 10     },     {       value: 20     }]   }, {     value: 30   }, {     value: 20   }] };  ...  render () {   return (     <CakeChart data={TREE} />   ); } Advanced Example
Tree Navigation
CakeChart is a quite dumb component that renders provided tree, but doesn't navigate through it, so you have to implement that part yourself. Which is not hard though.
const TREE = { ... };  /* finds parent of the selected node -    you can just store parent in the node itself, for example */ function findParentNode(node, child, parent = null) {   if (node === child) return parent;   for (let c of child.children || []) {     const p = findParent(node, c, child);     if (p) return p;   } }  class InteractiveCakeChart extends React.Component {   constructor(props) {     super(props);          this.state = {       selectedNode: TREE     }   }      render() {     return (       <CakeChart data={this.state.selectedNode}                  onClick={this.handleClick} />     );   }      handleClick = (node) => {     if (node === this.state.selectedNode) {       /* user clicked on the chart center - rendering parent node */       this.setState({ selectedNode: findParentNode(node, TREE) || TREE });     } else {       this.setState({ selectedNode: node });     }   } }Customization
function getSliceProps(slice, props) {   return { ...props, fill: (slice.level % 2) ? '#FF0000' : '#0000FF' }; }  function getLabel(slice, label) {   return slice.level === 0 ? `Value: ${slice.node.value}` : label; }  function getLabelProps(slice, props) {   return { ...props, style: { background: (slice.level % 2) ? '#FF0000' : '#0000FF' } }; }  class CustomizedCakeChart extends React.Component {   render() {     return (       <CakeChart data={TREE}                  coreRadius={120}                  ringWidth={80}                  ringWidthFactor={0.6}                  getSliceProps={getSliceProps}                  getLabelProps={getLabelProps}                  getLabel={getLabel} />     );   } } 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
