3.5.2 β€’ Published 5 years ago

@manosim/react-minimal-pie-chart v3.5.2

Weekly downloads
-
License
MIT
Repository
github
Last release
5 years ago

React minimal pie chart

Build Status Npm version Coveralls Bundle size

Lightweight React SVG pie charts, with versatile options and CSS animation included. πŸ‘ Β DemoΒ πŸ‘.

import PieChart from 'react-minimal-pie-chart';

<PieChart
  data={[
    { title: 'One', value: 10, color: '#E38627' },
    { title: 'Two', value: 15, color: '#C13C37' },
    { title: 'Three', value: 20, color: '#6A2135' },
  ]}
/>;

Installation

npm install react-minimal-pie-chart

If you don't use a package manager, react-minimal-pie-chart exposes also an UMD module ready for the browser.

https://unpkg.com/react-minimal-pie-chart/dist/index.js

Why?

Because Recharts is awesome, but when you just need a simple pie/donought chart, 3 kB of code are usually enough.

Features

Options

PropertyTypeDescriptionDefault
data (required)ArrayThe source data which each element is a segment.-
cxNumberThe x-coordinate of center. The value is the percentage of the component width50
cyNumberThe y-coordinate of center. The value is the percentage of the component height50
ratioNumberThe ratio of rendered svg element1
startAngleNumberThe start angle of first sector0
lengthAngleNumberThe total angle taken by the chart (can be negative to make the chart clockwise!)360
totalValueNumberThe total value represented by the full chart-
radiusNumberThe radius of the pie. The value is the percentage of the component's width50
lineWidthNumberThe width of the line representing each sector. The value is the percentage of chart's radio (100 === full pie)100
paddingAngleNumberThe angle between two sectors-
roundedBoolRound line caps of each sectorfalse
segmentsStyleObjectStyle object assigned each segment-
animateBoolAnimate sectors on component mountfalse
animationDurationNumberAnimation duration in ms500
animationEasingStringAnimation CSS easing"ease-out"
revealNumberTurn on CSS animation and reveal just a percentage of each segment-
injectSvgFunctionInject <svg> element with the output of the provided function (eg. gradients)-
labelBoolean, ReactElement, FunctionIf true set, labels will be drawn automatically. If ReactElement set, the option can be the custom label element. If set a function, the function will be called to render customized label.false
labelPositionNumberLabel position from origin. The value is the percentage of chart's radio (50 === middle point)50
labelStyleObjectStyle object assigned by default to each label-
onClickFunctionCustom event handler of onClick on each sector : (event, data, dataIndex) => {}-
onMouseOverFunctionCustom event handler of onMouseOver on each sector : (event, data, dataIndex) => {}-
onMouseOutFunctionCustom event handler of onMouseOut on each sector : (event, data, dataIndex) => {}-

label prop

When label is a function or ReactElement, the provided entity will be called with the following object respectively as first argument or as props:

const labelProps = {
  key: string,
  x: number,
  y: number,
  dx: number,
  dy: number,
  textAnchor: string,
  data: {
    // props.data array extended with:
    degrees: number,
    startOffset: number,
    percentage: number,
  }[],
  dataIndex: number,
  color: string,
  style: {[key: string]: string | number},
};

See some examples in the demo source.

Optional data.key value

Each data entry can also accept an optional key property just in case items' indexes weren't enough:

{ value: 10, key: 1, color: '#E38627' }

How to

User interactions with the chart

See demo and its source.

Browsers support

The main requirement of this library is an accurate rendering of SVG Stroke properties.

Not supported

  • IE ≀ 10

Partially supported

  • IE 11

Misc

How svg arc paths work?

https://codepen.io/lingtalfi/pen/yaLWJG

Size comparison

3kB

Todo's

  • Find a better paddingAngle implementation
  • Make a device/browser compatibility table
  • Background segment
  • Consider switching ReactMinimalPieChart to extend default React.Component
  • Consider moving storybook deployment to CI
  • Update to babel 7 along with Storybook
  • Get rid of duplicated looping logic in makeSegments and makeLabels
  • Configure Babel's "transform-object-rest-spread" with "useBuiltIns": true
  • Consider migrating source to TypeScript

Contributors

Thanks to you all (emoji key):

Andrea CarraroπŸ’» πŸ“– πŸš‡ ⚠️ πŸ‘€Stephane RuferπŸ› πŸ’»JΓΈrgen AabergπŸ’»Tobiah RexπŸ›Edward XiaoπŸ›David KonsumerπŸ’» πŸ“– πŸ’‘ πŸ€”OriπŸ€”