DevExtreme v24.2 is now available.

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

Your search did not match any results.

React Charts - Bullets

Bullet charts are useful when you need to compare a single measure to a target value. A bullet bar indicates the measure and a vertical line indicates the target value. The bullet also includes a zero level line that indicates zero on the scale.

Backend API
import React from 'react'; import Bullet, { Tooltip } from 'devextreme-react/bullet'; import { service } from './data.ts'; function customizeTooltip(arg: { value: number; target: number; }) { return { text: `Current t&#176: ${arg.value} &#176C<br>Average t&#176:${arg.target}&#176C`, }; } function App() { return ( <div id="chart-demo"> <div className="long-title"><h3>Daily temperature</h3></div> <table className="demo-table"> <tbody> <tr> <th></th> <th>June</th> <th>July</th> <th>August</th> </tr> {service.getWeeksData().map((week, i) => ( <tr key={i}> <th>{`${week.weekCount} week`}</th> {week.bulletsData.map((data, j) => ( <td key={j}> <Bullet className="bullet" startScaleValue={0} endScaleValue={35} value={data.value} target={data.target} color={data.color} > <Tooltip customizeTooltip={customizeTooltip} /> </Bullet> </td> ))} </tr> ))} </tbody> </table> </div> ); } export default App;
import React from 'react'; import Bullet, { Tooltip } from 'devextreme-react/bullet'; import { service } from './data.js'; function customizeTooltip(arg) { return { text: `Current t&#176: ${arg.value} &#176C<br>Average t&#176:${arg.target}&#176C`, }; } function App() { return ( <div id="chart-demo"> <div className="long-title"> <h3>Daily temperature</h3> </div> <table className="demo-table"> <tbody> <tr> <th></th> <th>June</th> <th>July</th> <th>August</th> </tr> {service.getWeeksData().map((week, i) => ( <tr key={i}> <th>{`${week.weekCount} week`}</th> {week.bulletsData.map((data, j) => ( <td key={j}> <Bullet className="bullet" startScaleValue={0} endScaleValue={35} value={data.value} target={data.target} color={data.color} > <Tooltip customizeTooltip={customizeTooltip} /> </Bullet> </td> ))} </tr> ))} </tbody> </table> </div> ); } export default App;
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.tsx'; ReactDOM.render( <App />, document.getElementById('app'), );
const weeksData = [{ weekCount: 'First', bulletsData: [{ value: 23, target: 20, color: '#ebdd8f', }, { value: 27, target: 24, color: '#e8c267', }, { value: 20, target: 26, color: '#e55253', }], }, { weekCount: 'Second', bulletsData: [{ value: 24, target: 22, color: '#ebdd8f', }, { value: 28, target: 24, color: '#e8c267', }, { value: 30, target: 24, color: '#e55253', }], }, { weekCount: 'Third', bulletsData: [{ value: 35, target: 24, color: '#ebdd8f', }, { value: 24, target: 26, color: '#e8c267', }, { value: 28, target: 22, color: '#e55253', }], }, { weekCount: 'Fourth', bulletsData: [{ value: 29, target: 25, color: '#ebdd8f', }, { value: 24, target: 27, color: '#e8c267', }, { value: 21, target: 21, color: '#e55253', }], }]; export const service = { getWeeksData() { return weeksData; }, };
window.exports = window.exports || {}; window.config = { transpiler: 'ts', typescriptOptions: { module: 'system', emitDecoratorMetadata: true, experimentalDecorators: true, jsx: 'react', }, meta: { 'react': { 'esModule': true, }, 'typescript': { 'exports': 'ts', }, 'devextreme/time_zone_utils.js': { 'esModule': true, }, 'devextreme/localization.js': { 'esModule': true, }, 'devextreme/viz/palette.js': { 'esModule': true, }, 'openai': { 'esModule': true, }, }, paths: { 'npm:': 'https://unpkg.com/', 'bundles:': '../../../../bundles/', 'externals:': '../../../../bundles/externals/', }, defaultExtension: 'js', map: { 'ts': 'npm:plugin-typescript@8.0.0/lib/plugin.js', 'typescript': 'npm:typescript@4.2.4/lib/typescript.js', 'jszip': 'npm:jszip@3.10.1/dist/jszip.min.js', 'react': 'npm:react@17.0.2/umd/react.development.js', 'react-dom': 'npm:react-dom@17.0.2/umd/react-dom.development.js', 'prop-types': 'npm:prop-types/prop-types.js', 'rrule': 'npm:rrule@2.6.4/dist/es5/rrule.js', 'luxon': 'npm:luxon@3.4.4/build/global/luxon.min.js', 'es6-object-assign': 'npm:es6-object-assign', 'devextreme': 'npm:devextreme@link:../../packages/devextreme/artifacts/npm/devextreme/cjs', 'devextreme-react': 'npm:devextreme-react@link:../../packages/devextreme-react/npm/cjs', 'devextreme-quill': 'npm:devextreme-quill@1.7.1/dist/dx-quill.min.js', 'devexpress-diagram': 'npm:devexpress-diagram@2.2.5/dist/dx-diagram.js', 'devexpress-gantt': 'npm:devexpress-gantt@4.1.54/dist/dx-gantt.js', '@devextreme/runtime': 'npm:@devextreme/runtime@3.0.12', 'inferno': 'npm:inferno@7.4.11/dist/inferno.min.js', 'inferno-compat': 'npm:inferno-compat/dist/inferno-compat.min.js', 'inferno-create-element': 'npm:inferno-create-element@7.4.11/dist/inferno-create-element.min.js', 'inferno-dom': 'npm:inferno-dom/dist/inferno-dom.min.js', 'inferno-hydrate': 'npm:inferno-hydrate/dist/inferno-hydrate.min.js', 'inferno-clone-vnode': 'npm:inferno-clone-vnode/dist/inferno-clone-vnode.min.js', 'inferno-create-class': 'npm:inferno-create-class/dist/inferno-create-class.min.js', 'inferno-extras': 'npm:inferno-extras/dist/inferno-extras.min.js', 'devextreme-cldr-data': 'npm:devextreme-cldr-data@1.0.3', // SystemJS plugins 'plugin-babel': 'npm:systemjs-plugin-babel@0.0.25/plugin-babel.js', 'systemjs-babel-build': 'npm:systemjs-plugin-babel@0.0.25/systemjs-babel-browser.js', // Prettier 'prettier/standalone': 'npm:prettier@2.8.8/standalone.js', 'prettier/parser-html': 'npm:prettier@2.8.8/parser-html.js', }, packages: { 'devextreme': { defaultExtension: 'js', }, 'devextreme-react': { main: 'index.js', }, 'devextreme/events/utils': { main: 'index', }, 'devextreme/localization/messages': { format: 'json', defaultExtension: 'json', }, 'devextreme/events': { main: 'index', }, 'es6-object-assign': { main: './index.js', defaultExtension: 'js', }, }, packageConfigPaths: [ 'npm:@devextreme/*/package.json', 'npm:@devextreme/runtime@3.0.12/inferno/package.json', ], babelOptions: { sourceMaps: false, stage0: true, react: true, }, }; System.config(window.config);
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.js'; ReactDOM.render(<App />, document.getElementById('app'));
const weeksData = [ { weekCount: 'First', bulletsData: [ { value: 23, target: 20, color: '#ebdd8f', }, { value: 27, target: 24, color: '#e8c267', }, { value: 20, target: 26, color: '#e55253', }, ], }, { weekCount: 'Second', bulletsData: [ { value: 24, target: 22, color: '#ebdd8f', }, { value: 28, target: 24, color: '#e8c267', }, { value: 30, target: 24, color: '#e55253', }, ], }, { weekCount: 'Third', bulletsData: [ { value: 35, target: 24, color: '#ebdd8f', }, { value: 24, target: 26, color: '#e8c267', }, { value: 28, target: 22, color: '#e55253', }, ], }, { weekCount: 'Fourth', bulletsData: [ { value: 29, target: 25, color: '#ebdd8f', }, { value: 24, target: 27, color: '#e8c267', }, { value: 21, target: 21, color: '#e55253', }, ], }, ]; export const service = { getWeeksData() { return weeksData; }, };
<!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/24.2.3/css/dx.light.css" /> <link rel="stylesheet" type="text/css" href="styles.css" /> <script src="https://unpkg.com/core-js@2.6.12/client/shim.min.js"></script> <script src="https://unpkg.com/systemjs@0.21.3/dist/system.js"></script> <script type="text/javascript" src="config.js"></script> <script type="text/javascript"> System.import("./index.tsx"); </script> </head> <body class="dx-viewport"> <div class="demo-container"> <div id="app"></div> </div> </body> </html>
#chart-demo { height: 440px; width: 100%; } .demo-table { margin-top: 80px; width: 100%; border: 1px solid #c2c2c2; border-collapse: collapse; } .demo-table th, .demo-table td { font-weight: 400; width: 200px; padding: 25px 10px 5px 10px; border: 1px solid #e5e5e5; } .demo-table th { padding: 25px 15px 20px 15px; border: 1px solid #c2c2c2; } .demo-table tr:nth-child(2) td { border-top: 1px solid #c2c2c2; } .demo-table td:first-of-type { border-left: 1px solid #c2c2c2; } .demo-table .bullet { width: 200px; height: 30px; } .long-title h3 { font-family: "Segoe UI Light", "Helvetica Neue Light", "Segoe UI", "Helvetica Neue", "Trebuchet MS", Verdana; font-weight: 200; font-size: 28px; text-align: center; margin-bottom: 20px; }

Configure the Bullet Bar

Specify the value property to set the length of the bullet bar. The value should be between the startScaleValue and endScaleValue. If you do not specify the scale range, the startScaleValue is 0 and the endScaleValue is calculated automatically based on measure and target values.

When you arrange several bullets in a column, set the same scale range for them so that their bullet bars can be compared visually.

To change the bar color, use the color property.

Configure the Target and Zero Level Lines

Set the target property to specify the target value. You can also use the targetColor and targetWidth properties to customize the target line appearance.

The zero level line indicates zero and has the same color as the target line. If you want to hide the zero level line, you can disable the showZeroLevel property.

Configure the Tooltip

A tooltip contains information about the measure and target values. To configure the tooltip, use the tooltip object. In this demo, the customizeTooltip function within this object customizes the tooltip content.

NOTE

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