UNPKG

react-native-chart-kit

Version:

If you're looking to **build a website or a cross-platform mobile app** – we will be happy to help you! Send a note to clients@ui1.io and we will be in touch with you shortly.

523 lines (447 loc) 28.9 kB
If you're looking to **build a website or a cross-platform mobile app** – we will be happy to help you! Send a note to clients@ui1.io and we will be in touch with you shortly. ![Chart Kit](https://i.imgur.com/Idp4WIX.jpg) [📲See example app](https://github.com/indiespirit/react-native-chart-kit-example) To try the examples in Expo, please change `main` to `./node_modules/expo/AppEntry.js` in `package.json` before starting things with `expo run`. You'll need to have `expo-cli` installed via `npm install -g expo-cli`. # React Native Chart Kit Documentation ## Import components 1. `yarn add react-native-chart-kit` 2. `yarn add react-native-svg` install peer dependencies 3. Use with ES6 syntax to import components ```js import { LineChart, BarChart, PieChart, ProgressChart, ContributionGraph, StackedBarChart } from "react-native-chart-kit"; ``` ## Quick Example ```jsx <View> <Text>Bezier Line Chart</Text> <LineChart data={{ labels: ["January", "February", "March", "April", "May", "June"], datasets: [ { data: [ Math.random() * 100, Math.random() * 100, Math.random() * 100, Math.random() * 100, Math.random() * 100, Math.random() * 100 ] } ] }} width={Dimensions.get("window").width} // from react-native height={220} yAxisLabel="$" yAxisSuffix="k" yAxisInterval={1} // optional, defaults to 1 chartConfig={{ backgroundColor: "#e26a00", backgroundGradientFrom: "#fb8c00", backgroundGradientTo: "#ffa726", decimalPlaces: 2, // optional, defaults to 2dp color: (opacity = 1) => `rgba(255, 255, 255, ${opacity})`, labelColor: (opacity = 1) => `rgba(255, 255, 255, ${opacity})`, style: { borderRadius: 16 }, propsForDots: { r: "6", strokeWidth: "2", stroke: "#ffa726" } }} bezier style={{ marginVertical: 8, borderRadius: 16 }} /> </View> ``` ## Chart style object Define a chart style object with following properies as such: ```js const chartConfig = { backgroundGradientFrom: "#1E2923", backgroundGradientFromOpacity: 0, backgroundGradientTo: "#08130D", backgroundGradientToOpacity: 0.5, color: (opacity = 1) => `rgba(26, 255, 146, ${opacity})`, strokeWidth: 2, // optional, default 3 barPercentage: 0.5, useShadowColorFromDataset: false // optional }; ``` | Property | Type | Description | | ----------------------------- | ------------------ | ------------------------------------------------------------------------------------------------------ | | backgroundGradientFrom | string | Defines the first color in the linear gradient of a chart's background | | backgroundGradientFromOpacity | Number | Defines the first color opacity in the linear gradient of a chart's background | | backgroundGradientTo | string | Defines the second color in the linear gradient of a chart's background | | backgroundGradientToOpacity | Number | Defines the second color opacity in the linear gradient of a chart's background | | fillShadowGradient | string | Defines the color of the area under data | | fillShadowGradientOpacity | Number | Defines the initial opacity of the area under data | | useShadowColorFromDataset | Boolean | Defines the option to use color from dataset to each chart data. Default is false | | color | function => string | Defines the base color function that is used to calculate colors of labels and sectors used in a chart | | strokeWidth | Number | Defines the base stroke width in a chart | | barPercentage | Number | Defines the percent (0-1) of the available width each bar width in a chart | | barRadius | Number | Defines the radius of each bar | | propsForBackgroundLines | props | Override styles of the background lines, refer to react-native-svg's Line documentation | | propsForLabels | props | Override styles of the labels, refer to react-native-svg's Text documentation | | propsForVerticalLabels | props | Override styles of vertical labels, refer to react-native-svg's Text documentation | | propsForHorizontalLabels | props | Override styles of horizontal labels, refer to react-native-svg's Text documentation | ## Responsive charts To render a responsive chart, use `Dimensions` react-native library to get the width of the screen of your device like such ```js import { Dimensions } from "react-native"; const screenWidth = Dimensions.get("window").width; ``` ## Line Chart ![Line Chart](https://i.imgur.com/Wt26snd.jpg) ```js const data = { labels: ["January", "February", "March", "April", "May", "June"], datasets: [ { data: [20, 45, 28, 80, 99, 43], color: (opacity = 1) => `rgba(134, 65, 244, ${opacity})`, // optional strokeWidth: 2 // optional } ], legend: ["Rainy Days"] // optional }; ``` ```jsx <LineChart data={data} width={screenWidth} height={220} chartConfig={chartConfig} /> ``` | Property | Type | Description | | ----------------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | data | Object | Data for the chart - see example above | | width | Number | Width of the chart, use 'Dimensions' library to get the width of your screen for responsive | | height | Number | Height of the chart | | withDots | boolean | Show dots on the line - default: True | | withShadow | boolean | Show shadow for line - default: True | | withInnerLines | boolean | Show inner dashed lines - default: True | | withOuterLines | boolean | Show outer dashed lines - default: True | | withVerticalLines | boolean | Show vertical lines - default: True | | withHorizontalLines | boolean | Show horizontal lines - default: True | | withVerticalLabels | boolean | Show vertical labels - default: True | | withHorizontalLabels | boolean | Show horizontal labels - default: True | | fromZero | boolean | Render charts from 0 not from the minimum value. - default: False | | yAxisLabel | string | Prepend text to horizontal labels -- default: '' | | yAxisSuffix | string | Append text to horizontal labels -- default: '' | | xAxisLabel | string | Prepend text to vertical labels -- default: '' | | yAxisInterval | string | Display y axis line every {x} input. -- default: 1 | | chartConfig | Object | Configuration object for the chart, see example config object above | | decorator | Function | This function takes a [whole bunch](https://github.com/indiespirit/react-native-chart-kit/blob/master/src/line-chart/line-chart.js#L292) of stuff and can render extra elements, such as data point info or additional markup. | | onDataPointClick | Function | Callback that takes `{value, dataset, getColor}` | | horizontalLabelRotation | number (degree) | Rotation angle of the horizontal labels - default 0 | | verticalLabelRotation | number (degree) | Rotation angle of the vertical labels - default 0 | | getDotColor | function => string | Defines the dot color function that is used to calculate colors of dots in a line chart and takes `(dataPoint, dataPointIndex)` | | renderDotContent | Function | Render additional content for the dot. Takes `({x, y, index, indexData})` as arguments. | | yLabelsOffset | number | Offset for Y axis labels | | xLabelsOffset | number | Offset for X axis labels | | hidePointsAtIndex | number[] | Indices of the data points you don't want to display | | formatYLabel | Function | This function change the format of the display value of the Y label. Takes the Y value as argument and should return the desirable string. | | formatXLabel | Function | This function change the format of the display value of the X label. Takes the X value as argument and should return the desirable string. | | getDotProps | (value, index) => props | This is an alternative to chartConfig's propsForDots | | segments | number | The amount of horizontal lines - default 4 | ## Bezier Line Chart ![Line Chart](https://i.imgur.com/EnUiZZU.jpg) ```jsx <LineChart data={data} width={screenWidth} height={256} verticalLabelRotation={30} chartConfig={chartConfig} bezier /> ``` | Property | Type | Description | | -------- | ------- | ----------------------------------------------------- | | bezier | boolean | Add this prop to make the line chart smooth and curvy | ## Progress Ring ![Progress Chart](https://i.imgur.com/U4lkW0K.jpg) ```js // each value represents a goal ring in Progress chart const data = { labels: ["Swim", "Bike", "Run"], // optional data: [0.4, 0.6, 0.8] }; ``` ```jsx <ProgressChart data={data} width={screenWidth} height={220} strokeWidth={16} radius={32} chartConfig={chartConfig} hideLegend={false} /> ``` | Property | Type | Description | | ----------- | ------- | ------------------------------------------------------------------------------------------- | | data | Object | Data for the chart - see example above | | width | Number | Width of the chart, use 'Dimensions' library to get the width of your screen for responsive | | height | Number | Height of the chart | | strokeWidth | Number | Width of the stroke of the chart - default: 16 | | radius | Number | Inner radius of the chart - default: 32 | | chartConfig | Object | Configuration object for the chart, see example config in the beginning of this file | | hideLegend | Boolean | Switch to hide chart legend (defaults to false) | ## Bar chart ![Bat Chart](https://i.imgur.com/jVHEWiI.jpg) ```js const data = { labels: ["January", "February", "March", "April", "May", "June"], datasets: [ { data: [20, 45, 28, 80, 99, 43] } ] }; ``` ```jsx <BarChart style={graphStyle} data={data} width={screenWidth} height={220} yAxisLabel="$" chartConfig={chartConfig} verticalLabelRotation={30} /> ``` | Property | Type | Description | | ----------------------- | --------------- | ------------------------------------------------------------------------------------------- | | data | Object | Data for the chart - see example above | | width | Number | Width of the chart, use 'Dimensions' library to get the width of your screen for responsive | | height | Number | Height of the chart | | withVerticalLabels | boolean | Show vertical labels - default: True | | withHorizontalLabels | boolean | Show horizontal labels - default: True | | fromZero | boolean | Render charts from 0 not from the minimum value. - default: False | | withInnerLines | boolean | Show inner dashed lines - default: True | | yAxisLabel | string | Prepend text to horizontal labels -- default: '' | | yAxisSuffix | string | Append text to horizontal labels -- default: '' | | chartConfig | Object | Configuration object for the chart, see example config in the beginning of this file | | horizontalLabelRotation | number (degree) | Rotation angle of the horizontal labels - default 0 | | verticalLabelRotation | number (degree) | Rotation angle of the vertical labels - default 0 | | showBarTops | boolean | Show bar tops | | showValuesOnTopOfBars | boolean | Show value above bars | ## StackedBar chart ![StackedBar_Chart](https://imgur.com/JkBtxt8.jpg) ```js const data = { labels: ["Test1", "Test2"], legend: ["L1", "L2", "L3"], data: [ [60, 60, 60], [30, 30, 60] ], barColors: ["#dfe4ea", "#ced6e0", "#a4b0be"] }; ``` ```jsx <StackedBarChart style={graphStyle} data={data} width={screenWidth} height={220} chartConfig={chartConfig} /> ``` | Property | Type | Description | | -------------------- | ------- | ------------------------------------------------------------------------------------------- | | data | Object | Data for the chart - see example above | | width | Number | Width of the chart, use 'Dimensions' library to get the width of your screen for responsive | | height | Number | Height of the chart | | withVerticalLabels | boolean | Show vertical labels - default: True | | withHorizontalLabels | boolean | Show horizontal labels - default: True | | chartConfig | Object | Configuration object for the chart, see example config in the beginning of this file | | barPercentage | Number | Defines the percent (0-1) of the available width each bar width in a chart | | showLegend | boolean | Show legend - default: True | ## Pie chart ![Pie Chart](https://i.imgur.com/JMz3obk.jpg) ### Modified Pie Chart Screenshot ![Pie Chart_modified](/src/piechart_modified.png) ```js const data = [ { name: "Seoul", population: 21500000, color: "rgba(131, 167, 234, 1)", legendFontColor: "#7F7F7F", legendFontSize: 15 }, { name: "Toronto", population: 2800000, color: "#F00", legendFontColor: "#7F7F7F", legendFontSize: 15 }, { name: "Beijing", population: 527612, color: "red", legendFontColor: "#7F7F7F", legendFontSize: 15 }, { name: "New York", population: 8538000, color: "#ffffff", legendFontColor: "#7F7F7F", legendFontSize: 15 }, { name: "Moscow", population: 11920000, color: "rgb(0, 0, 255)", legendFontColor: "#7F7F7F", legendFontSize: 15 } ]; ``` ```jsx <PieChart data={data} width={screenWidth} height={220} chartConfig={chartConfig} accessor={"population"} backgroundColor={"transparent"} paddingLeft={"15"} center={[10, 50]} absolute /> ``` | Property | Type | Description | | -------------- | ------- | ------------------------------------------------------------------------------------------------- | | data | Object | Data for the chart - see example above | | width | Number | Width of the chart, use 'Dimensions' library to get the width of your screen for responsive | | height | Number | Height of the chart | | chartConfig | Object | Configuration object for the chart, see example config in the beginning of this file | | accessor | string | Property in the `data` object from which the number values are taken | | bgColor | string | background color - if you want to set transparent, input `transparent` or `none`. | | paddingLeft | string | left padding of the pie chart | | center | array | offset x and y coordinates to position the chart | | absolute | boolean | shows the values as absolute numbers | | hasLegend | boolean | Defaults to `true`, set it to `false` to remove the legend | | avoidFalseZero | boolean | Defaults to `false`, set it to `true` to display a "<1%" instead of a rounded value equal to "0%" | ## Contribution graph (heatmap) ![Contribution Graph](https://i.imgur.com/NKURRt6.jpg) This type of graph is often use to display a developer contribution activity. However, there many other use cases this graph is used when you need to visualize a frequency of a certain event over time. ```js const commitsData = [ { date: "2017-01-02", count: 1 }, { date: "2017-01-03", count: 2 }, { date: "2017-01-04", count: 3 }, { date: "2017-01-05", count: 4 }, { date: "2017-01-06", count: 5 }, { date: "2017-01-30", count: 2 }, { date: "2017-01-31", count: 3 }, { date: "2017-03-01", count: 2 }, { date: "2017-04-02", count: 4 }, { date: "2017-03-05", count: 2 }, { date: "2017-02-30", count: 4 } ]; ``` ```jsx <ContributionGraph values={commitsData} endDate={new Date("2017-04-01")} numDays={105} width={screenWidth} height={220} chartConfig={chartConfig} /> ``` | Property | Type | Description | | ------------------ | -------- | ------------------------------------------------------------------------------------------- | | data | Object | Data for the chart - see example above | | width | Number | Width of the chart, use 'Dimensions' library to get the width of your screen for responsive | | height | Number | Height of the chart | | gutterSize | Number | Size of the gutters between the squares in the chart | | squareSize | Number | Size of the squares in the chart | | horizontal | boolean | Should graph be laid out horizontally? Defaults to `true` | | showMonthLabels | boolean | Should graph include labels for the months? Defaults to `true` | | showOutOfRangeDays | boolean | Should graph be filled with squares, including days outside the range? Defaults to `false` | | chartConfig | Object | Configuration object for the chart, see example config in the beginning of this file | | accessor | string | Property in the `data` object from which the number values are taken; defaults to `count` | | getMonthLabel | function | Function which returns the label for each month, taking month index (0 - 11) as argument | | onDayPress | function | Callback invoked when the user clicks a day square on the chart; takes a value-item object | ## More styling Every charts also accepts `style` props, which will be applied to parent `svg` or `View` component of each chart. ## Abstract Chart `src/abstract-chart.js` is an extendable class which can be used to create your own charts! The following methods are available: ### renderHorizontalLines(config) Renders background horizontal lines like in the Line Chart and Bar Chart. Takes a config object with following properties: ```js { // width of your chart width: Number, // height of your chart height: Number, // how many lines to render count: Number, // top padding from the chart top edge paddingTop: Number } ``` ### renderVerticalLabels(config) Render background vertical lines. Takes a config object with following properties: ```js { // data needed to calculate the number of lines to render data: Array, // width of your chart width: Number, // height of your chart height: Number, paddingTop: Number, paddingRight: Number } ``` ### renderDefs(config) Render definitions of background and shadow gradients ```js { // width of your chart width: Number, // height of your chart height: Number, // first color of background gradient backgroundGradientFrom: String, // first color opacity of background gradient (0 - 1.0) backgroundGradientFromOpacity: Number, // second color of background gradient backgroundGradientTo: String, // second color opacity of background gradient (0 - 1.0) backgroundGradientToOpacity: Number, } ``` ## Compilation For production use, the package is automatically compiled after installation, so that you can just install it with `npm` and use it out-of-the-box. To transpile TypeScript into JavaScript for development purposes, you can use either run `npm run build` to compile once, or `npm run dev` to start compilation in watch mode, which will recompile the files on change. ## More information This library is built on top of the following open-source projects: - react-native-svg (https://github.com/react-native-community/react-native-svg) - paths-js (https://github.com/andreaferretti/paths-js) - react-native-calendar-heatmap (https://github.com/ayooby/react-native-calendar-heatmap) ## Contribute See the [contribution guide](contributing.md) and join [the contributors](https://github.com/indiespirit/react-native-chart-kit/graphs/contributors)!