Overview
DevExtreme Vue Gauge controls help you visualize data and create dashboards. Our library includes three gauge types: radial bar gauges, circular scale gauges, and linear gauges.
This demo displays a simple dashboard with a few highly customized gauges.
Review other demos in this section to explore gauge features such as geometry customization, palettes, tooltips, and custom label display.
You can use Vue syntax and techniques to instantiate and configure the gauges or handle their events. In addition, the components support prop validation. Find out more about DevExtreme Vue components.
Feel free to share demo-related thoughts here.
If you have technical questions, please create a support ticket in the DevExpress Support Center.
Thank you for the feedback!
If you have technical questions, please create a support ticket in the DevExpress Support Center.
Backend API
<template>
<div id="gauge-demo">
<div id="gauge-container">
<div class="left-section">
<GaugeIndicator
:value="speedValue / 2"
:inverted="false"
:start-angle="180"
:end-angle="90"
/>
<GaugeIndicator
:value="speedValue / 2"
:inverted="true"
:start-angle="-90"
:end-angle="-180"
/>
</div>
<div class="center-section">
<DxCircularGauge
:value="speedValue"
center-template="centerTemplate"
>
<DxSize :width="260"/>
<DxValueIndicator
:indent-from-center="55"
:color="color"
:spindle-size="0"
:spindle-gap-size="0"
/>
<DxGeometry
:start-angle="225"
:end-angle="315"
/>
<DxScale
:start-value="20"
:end-value="200"
:tick-interval="20"
:minor-tick-interval="10"
/>
<template #centerTemplate="data">
<svg>
<circle
cx="100"
cy="100"
r="55"
stroke-width="2"
:stroke="color"
fill="transparent"
/>
<text
text-anchor="middle"
x="100"
y="100"
font-size="50"
font-weight="lighter"
alignment-baseline="middle"
:fill="color"
>{{ data.data.value() }}</text>
</svg>
</template>
</DxCircularGauge>
<DxLinearGauge
id="fuel-gauge"
:value="50 - speedValue * 0.24"
>
<DxLinearSize
:width="90"
:height="20"
/>
<DxLinearScale
:start-value="0"
:end-value="50"
:tick-interval="25"
:minor-tick-interval="12.5"
>
<DxMinorTick :visible="true"/>
<DxLabel :visible="false"/>
</DxLinearScale>
<DxLinearValueIndicator
:size="8"
:offset="7"
:color="color"
/>
</DxLinearGauge>
</div>
<div class="right-section">
<GaugeIndicator
:value="speedValue / 2"
:inverted="true"
:start-angle="90"
:end-angle="0"
/>
<GaugeIndicator
:value="speedValue / 2"
:inverted="false"
:start-angle="0"
:end-angle="-90"
/>
</div>
</div>
<DxSlider
id="slider"
v-model:value="speedValue"
:width="155"
:min="0"
:max="200"
/>
</div>
</template>
<script>
import DxSlider from 'devextreme-vue/slider';
import DxCircularGauge, {
DxSize,
DxValueIndicator,
DxGeometry,
DxScale,
} from 'devextreme-vue/circular-gauge';
import DxLinearGauge, {
DxSize as DxLinearSize,
DxValueIndicator as DxLinearValueIndicator,
DxScale as DxLinearScale,
DxMinorTick,
DxLabel,
} from 'devextreme-vue/linear-gauge';
import GaugeIndicator from './GaugeIndicator.vue';
export default {
components: {
DxSlider,
DxCircularGauge,
DxSize,
DxValueIndicator,
DxGeometry,
DxScale,
DxLinearGauge,
DxLinearSize,
DxLinearValueIndicator,
DxLinearScale,
DxMinorTick,
DxLabel,
GaugeIndicator,
},
data() {
return {
speedValue: 40,
color: '#f05b41',
};
},
};
</script>
<style src="./styles.css"></style>
<template>
<DxCircularGauge :value="value">
<DxSize
:width="90"
:height="90"
/>
<DxValueIndicator color="#f05b41"/>
<DxGeometry
:start-angle="startAngle"
:end-angle="endAngle"
/>
<DxScale
:start-value="inverted ? 100 : 0"
:end-value="inverted ? 0 : 100"
:tick-interval="50"
/>
</DxCircularGauge>
</template>
<script>
import DxCircularGauge, {
DxSize,
DxValueIndicator,
DxGeometry,
DxScale,
} from 'devextreme-vue/circular-gauge';
export default {
components: {
DxCircularGauge,
DxSize,
DxValueIndicator,
DxGeometry,
DxScale,
},
props: {
value: {
type: Number,
default: 0,
},
startAngle: {
type: Number,
default: 0,
},
endAngle: {
type: Number,
default: 90,
},
inverted: {
type: Boolean,
default: true,
},
},
};
</script>
import { createApp } from 'vue';
import App from './App.vue';
createApp(App).mount('#app');
<!DOCTYPE html>
<html>
<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=1.0" />
<link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/23.1.5/css/dx.light.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.js");
</script>
</head>
<body class="dx-viewport">
<div class="demo-container">
<div id="app"> </div>
</div>
</body>
</html>
#gauge-demo {
height: 500px;
}
#gauge-container {
text-align: center;
margin: 20px auto;
background-image: url('../../../../images/Gauges/mask.png');
background-repeat: no-repeat;
width: 786px;
height: 500px;
}
#gauge-container > div {
display: inline-block;
position: relative;
}
.left-section {
top: -20px;
left: -44px;
}
.center-section {
top: 25px;
}
.right-section {
top: -20px;
right: -44px;
}
#fuel-gauge {
position: absolute;
left: 34%;
bottom: 5%;
}
#slider {
position: relative;
top: -105px;
margin: 0 auto;
}
#slider .dx-slider-bar {
background-color: #fff;
}
#slider .dx-slider-handle {
background-color: #f05b41;
width: 16px;
height: 16px;
margin-top: -8px;
margin-right: -8px;
border-radius: 50%;
border: none;
}
#slider .dx-slider-handle .dx-inkripple-wave {
background: none;
}
#slider .dx-slider-handle::after {
background-color: #f05b41;
}
#slider .dx-slider-range.dx-slider-range-visible {
border-color: #f05b41;
background-color: #f05b41;
}
window.exports = window.exports || {};
window.config = {
transpiler: 'plugin-babel',
meta: {
'*.vue': {
loader: 'vue-loader',
},
'*.ts': {
loader: 'demo-ts-loader',
},
'*.svg': {
loader: 'svg-loader',
},
'devextreme/localization.js': {
'esModule': true,
},
},
paths: {
'root:': '../../../../../',
'npm:': 'https://unpkg.com/',
},
map: {
'vue': 'npm:vue@3.3.4/dist/vue.esm-browser.js',
'vue-loader': 'npm:dx-systemjs-vue-browser@1.1.1/index.js',
'demo-ts-loader': 'root:utils/demo-ts-loader.js',
'svg-loader': 'root:utils/svg-loader.js',
'mitt': 'npm:mitt/dist/mitt.umd.js',
'rrule': 'npm:rrule@2.6.4/dist/es5/rrule.js',
'luxon': 'npm:luxon@1.28.1/build/global/luxon.min.js',
'es6-object-assign': 'npm:es6-object-assign@1.1.0',
'devextreme': 'npm:devextreme@23.1.6/cjs',
'devextreme-vue': 'npm:devextreme-vue@23.1.6',
'jszip': 'npm:jszip@3.7.1/dist/jszip.min.js',
'devextreme-quill': 'npm:devextreme-quill@1.6.2/dist/dx-quill.min.js',
'devexpress-diagram': 'npm:devexpress-diagram@2.2.2/dist/dx-diagram.js',
'devexpress-gantt': 'npm:devexpress-gantt@4.1.49/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@7.4.11/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',
'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.4/standalone.js',
'prettier/parser-html': 'npm:prettier@2.8.4/parser-html.js',
},
packages: {
'devextreme-vue': {
main: 'index.js',
},
'devextreme': {
defaultExtension: 'js',
},
'devextreme/events/utils': {
main: 'index',
},
'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,
},
};
System.config(window.config);