DevExtreme v26.1 is now available.

Explore our newest features/capabilities and share your thoughts with us.

Your search did not match any results.

React Charts - Overview

DevExtreme React Charts comprise 30+ UI components for data visualization, including bars, areas, lines, bubbles, pie, funnels, sparklines, treemaps, and other chart types.

DevExtreme Accessibility Compliance
DevExtreme component libraries meet a variety of WCAG and Section 508 compliance standards. To assess this demo's accessibility level, click the Run AXE® Validation button to launch the AXE® web accessibility evaluation tool.
All trademarks or registered trademarks are property of their respective owners. AXE® Terms of Use
The overall accessibility level of your application depends on the Charts features used.
Backend API
import React from 'react'; import Chart, { ArgumentAxis, CommonSeriesSettings, Legend, Series, Tooltip, ValueAxis, ConstantLine, Label, } from 'devextreme-react/chart'; import type { ChartTypes } from 'devextreme-react/chart'; import { complaintsData } from './data.ts'; const data = complaintsData.sort((a, b) => b.count - a.count); const totalCount = data.reduce((prevValue, item) => prevValue + item.count, 0); let cumulativeCount = 0; const dataArray = data.map((item) => { cumulativeCount += item.count; return { complaint: item.complaint, count: item.count, cumulativePercentage: Math.round((cumulativeCount * 100) / totalCount), }; }); const customizeTooltip = (pointInfo: ChartTypes.CommonPointInfo): Record<string, string> => ({ html: `<div><div class="tooltip-header">${ pointInfo.argumentText }</div><div class="tooltip-body"><div class="series-name"><span class='top-series-name'>${ pointInfo.points?.[0]?.seriesName }</span>: </div><div class="value-text"><span class='top-series-value'>${ pointInfo.points?.[0]?.valueText }</span></div><div class="series-name"><span class='bottom-series-name'>${ pointInfo.points?.[1]?.seriesName }</span>: </div><div class="value-text"><span class='bottom-series-value'>${ pointInfo.points?.[1]?.valueText }</span>% </div></div></div>`, }); function customizePercentageText({ valueText }: { valueText: string }): string { return `${valueText}%`; } function App() { return ( <Chart title="Pizza Shop Complaints" dataSource={dataArray} palette="Harmony Light" id="chart" > <CommonSeriesSettings argumentField="complaint" /> <Series name="Complaint frequency" valueField="count" axis="frequency" type="bar" color="#fac29a" /> <Series name="Cumulative percentage" valueField="cumulativePercentage" axis="percentage" type="spline" color="#6b71c3" /> <ArgumentAxis> <Label overlappingBehavior="stagger" /> </ArgumentAxis> <ValueAxis name="frequency" position="left" tickInterval={300} /> <ValueAxis name="percentage" position="right" tickInterval={20} showZero={true} valueMarginsEnabled={false} > <Label customizeText={customizePercentageText} /> <ConstantLine value={80} width={2} color="#fc3535" dashStyle="dash"> <Label visible={false} /> </ConstantLine> </ValueAxis> <Tooltip enabled={true} shared={true} customizeTooltip={customizeTooltip} /> <Legend verticalAlignment="top" horizontalAlignment="center" /> </Chart> ); } export default App;
import React from 'react'; import Chart, { ArgumentAxis, CommonSeriesSettings, Legend, Series, Tooltip, ValueAxis, ConstantLine, Label, } from 'devextreme-react/chart'; import { complaintsData } from './data.js'; const data = complaintsData.sort((a, b) => b.count - a.count); const totalCount = data.reduce((prevValue, item) => prevValue + item.count, 0); let cumulativeCount = 0; const dataArray = data.map((item) => { cumulativeCount += item.count; return { complaint: item.complaint, count: item.count, cumulativePercentage: Math.round((cumulativeCount * 100) / totalCount), }; }); const customizeTooltip = (pointInfo) => ({ html: `<div><div class="tooltip-header">${pointInfo.argumentText}</div><div class="tooltip-body"><div class="series-name"><span class='top-series-name'>${pointInfo.points?.[0]?.seriesName}</span>: </div><div class="value-text"><span class='top-series-value'>${pointInfo.points?.[0]?.valueText}</span></div><div class="series-name"><span class='bottom-series-name'>${pointInfo.points?.[1]?.seriesName}</span>: </div><div class="value-text"><span class='bottom-series-value'>${pointInfo.points?.[1]?.valueText}</span>% </div></div></div>`, }); function customizePercentageText({ valueText }) { return `${valueText}%`; } function App() { return ( <Chart title="Pizza Shop Complaints" dataSource={dataArray} palette="Harmony Light" id="chart" > <CommonSeriesSettings argumentField="complaint" /> <Series name="Complaint frequency" valueField="count" axis="frequency" type="bar" color="#fac29a" /> <Series name="Cumulative percentage" valueField="cumulativePercentage" axis="percentage" type="spline" color="#6b71c3" /> <ArgumentAxis> <Label overlappingBehavior="stagger" /> </ArgumentAxis> <ValueAxis name="frequency" position="left" tickInterval={300} /> <ValueAxis name="percentage" position="right" tickInterval={20} showZero={true} valueMarginsEnabled={false} > <Label customizeText={customizePercentageText} /> <ConstantLine value={80} width={2} color="#fc3535" dashStyle="dash" > <Label visible={false} /> </ConstantLine> </ValueAxis> <Tooltip enabled={true} shared={true} customizeTooltip={customizeTooltip} /> <Legend verticalAlignment="top" horizontalAlignment="center" /> </Chart> ); } export default App;
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.tsx'; ReactDOM.render( <App />, document.getElementById('app'), );
export const complaintsData = [ { complaint: 'Cold pizza', count: 780 }, { complaint: 'Not enough cheese', count: 120 }, { complaint: 'Underbaked or Overbaked', count: 52 }, { complaint: 'Delayed delivery', count: 1123 }, { complaint: 'Damaged pizza', count: 321 }, { complaint: 'Incorrect billing', count: 89 }, { complaint: 'Wrong size delivered', count: 222 }, ];
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.js'; ReactDOM.render(<App />, document.getElementById('app'));
export const complaintsData = [ { complaint: 'Cold pizza', count: 780 }, { complaint: 'Not enough cheese', count: 120 }, { complaint: 'Underbaked or Overbaked', count: 52 }, { complaint: 'Delayed delivery', count: 1123 }, { complaint: 'Damaged pizza', count: 321 }, { complaint: 'Incorrect billing', count: 89 }, { complaint: 'Wrong size delivered', count: 222 }, ];
<!DOCTYPE html> <html lang="en"> <head> <title>DevExtreme Demo</title> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/26.1.5/css/dx.light.css" /> <link rel="stylesheet" type="text/css" href="./bundle.css" /> </head> <body class="dx-viewport"> <div class="demo-container"> <div id="app"></div> </div> <script src="bundles/vendor/react.vendor.js"></script> <script src="./bundle.js"></script> </body> </html>
#chart { height: 440px; } .tooltip-header { margin-bottom: 5px; font-size: 16px; font-weight: 500; padding-bottom: 5px; border-bottom: 1px solid #c5c5c5; } .tooltip-body { width: 170px; } .tooltip-body .series-name { font-weight: normal; opacity: 0.6; display: inline-block; line-height: 1.5; padding-right: 10px; width: 126px; } .tooltip-body .value-text { display: inline-block; line-height: 1.5; width: 30px; }

Use our DevExpress BI Dashboard to embed interactive business intelligence into your next web app.

The Web Dashboard is a data analysis UI component that you can embed into your ASP.NET Core or Angular, React, and Vue applications with .NET backend. Dashboards allow you to display multiple inter-connected data analysis elements such as grids, charts, maps, gauges, and others: all within an automatically-arranged layout.

The set of components allows you to deploy an all-in-one solution and switch between Viewer and Designer modes directly on the web client (includes adaptive layouts for tablet & mobile).

The Web Dashboard is available as a part of a Universal subscription.

Get Started with DevExpress BI Dashboard | Explore Demos