Wind Rose
Documentation
This demo illustrates a wind rose using the PolarChart component. To specify chart arguments that correspond to cardinal points, the discreteAxisDivisionMode and firstPointOnStartAngle properties of the argumentAxis object are set. In addition, the chart’s onLegendClick event is handled for you to be able to exclude/include certain series to the PolarChart at runtime.
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="chart-demo">
<DxPolarChart
id="radarChart"
:data-source="periodValues"
palette="Soft"
title="Wind Rose, Philadelphia PA"
@legend-click="onLegendClick"
>
<DxCommonSeriesSettings type="stackedbar"/>
<DxSeries
v-for="wind in windSources"
:key="wind.value"
:value-field="wind.value"
:name="wind.name"
/>
<DxMargin
:bottom="50"
:left="100"
/>
<DxArgumentAxis
:first-point-on-start-angle="true"
discrete-axis-division-mode="crossLabels"
/>
<DxValueAxis :value-margins-enabled="false"/>
<DxExport :enabled="true"/>
</DxPolarChart>
<div class="center">
<DxSelectBox
:width="300"
:data-source="windRoseData"
:input-attr="{ 'aria-label': 'Period' }"
v-model:value="selectedPeriod"
display-expr="period"
value-expr="period"
/>
</div>
</div>
</template>
<script setup lang="ts">
import { ref, computed } from 'vue';
import {
DxPolarChart,
DxPolarChartTypes,
DxCommonSeriesSettings,
DxSeries,
DxArgumentAxis,
DxValueAxis,
DxMargin,
DxExport,
} from 'devextreme-vue/polar-chart';
import DxSelectBox from 'devextreme-vue/select-box';
import { windSources, windRoseData } from './data.ts';
const selectedPeriod = ref(windRoseData[0].period);
const periodValues = computed(
() => windRoseData.find(({ period }) => period === selectedPeriod.value).values,
);
function onLegendClick({ target }: DxPolarChartTypes.LegendClickEvent) {
target.isVisible()
? target.hide()
: target.show();
}
</script>
<style>
#chart-demo {
height: 600px;
}
#radarChart {
height: 500px;
}
#chart-demo > .center {
text-align: center;
}
#chart-demo > .center > .dx-widget {
display: inline-block;
vertical-align: middle;
}
</style>
window.exports = window.exports || {};
window.config = {
transpiler: 'plugin-babel',
meta: {
'*.vue': {
loader: 'vue-loader',
},
'*.ts': {
loader: 'demo-ts-loader',
},
'*.svg': {
loader: 'svg-loader',
},
'devextreme/time_zone_utils.js': {
'esModule': true,
},
'devextreme/localization.js': {
'esModule': true,
},
'devextreme/viz/palette.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.2.5/cjs',
'devextreme-vue': 'npm:devextreme-vue@23.2.5/cjs',
'jszip': 'npm:jszip@3.10.1/dist/jszip.min.js',
'devextreme-quill': 'npm:devextreme-quill@1.6.4/dist/dx-quill.min.js',
'devexpress-diagram': 'npm:devexpress-diagram@2.2.5/dist/dx-diagram.js',
'devexpress-gantt': 'npm:devexpress-gantt@4.1.51/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);
export const windSources = [
{ value: 'val1', name: '1.3-4 m/s' },
{ value: 'val2', name: '4-8 m/s' },
{ value: 'val3', name: '8-13 m/s' },
{ value: 'val4', name: '13-19 m/s' },
{ value: 'val5', name: '19-25 m/s' },
{ value: 'val6', name: '25-32 m/s' },
{ value: 'val7', name: '32-39 m/s' },
{ value: 'val8', name: '39-47 m/s' },
];
export const windRoseData = [{
period: 'Sep. 1, 2012 - Oct. 1, 2012',
values: [{
arg: 'N',
val1: 0.7,
val2: 1.7,
val3: 2,
val4: 1,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'NNE',
val1: 0.1,
val2: 0.6,
val3: 0,
val4: 0,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'NE',
val1: 0.3,
val2: 0.8,
val3: 0,
val4: 0,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'ENE',
val1: 0.3,
val2: 0.7,
val3: 0,
val4: 0,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'E',
val1: 0.7,
val2: 3.2,
val3: 3,
val4: 0,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'ESE',
val1: 0.8,
val2: 1.5,
val3: 0,
val4: 0,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'SE',
val1: 0.3,
val2: 1.3,
val3: 0,
val4: 0,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'SSE',
val1: 0.1,
val2: 2.4,
val3: 0,
val4: 0,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'S',
val1: 1.1,
val2: 4.2,
val3: 2,
val4: 0,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'SSW',
val1: 0.6,
val2: 3.6,
val3: 3,
val4: 0,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'SW',
val1: 0.8,
val2: 2.5,
val3: 5,
val4: 1,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'WSW',
val1: 0.3,
val2: 2.6,
val3: 3,
val4: 0,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'W',
val1: 0.6,
val2: 1.7,
val3: 3,
val4: 0,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'WNW',
val1: 0.7,
val2: 2.5,
val3: 3,
val4: 0,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'NW',
val1: 1,
val2: 3.2,
val3: 3,
val4: 1,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'NNW',
val1: 0.6,
val2: 3.8,
val3: 4,
val4: 2,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}],
}, {
period: 'Oct. 1, 2012 - Nov. 1, 2012',
values: [{
arg: 'N',
val1: 0.6,
val2: 1.8,
val3: 2,
val4: 1,
val5: 0,
val6: 1,
val7: 0,
val8: 0,
}, {
arg: 'NNE',
val1: 0.3,
val2: 1.2,
val3: 1,
val4: 0,
val5: 1,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'NE',
val1: 0.3,
val2: 2.4,
val3: 2,
val4: 1,
val5: 1,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'ENE',
val1: 1,
val2: 2.2,
val3: 1,
val4: 0,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'E',
val1: 0.6,
val2: 4.9,
val3: 2,
val4: 0,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'ESE',
val1: 0.1,
val2: 0.6,
val3: 0,
val4: 0,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'SE',
val1: 0.1,
val2: 0.3,
val3: 1,
val4: 1,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'SSE',
val1: 0.4,
val2: 0.7,
val3: 1,
val4: 0,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'S',
val1: 0,
val2: 3.1,
val3: 3,
val4: 1,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'SSW',
val1: 0.6,
val2: 1.8,
val3: 4,
val4: 1,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'SW',
val1: 0.7,
val2: 1.8,
val3: 2,
val4: 1,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'WSW',
val1: 0.3,
val2: 2.5,
val3: 5,
val4: 1,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'W',
val1: 0,
val2: 2.8,
val3: 6,
val4: 2,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'WNW',
val1: 0.3,
val2: 1.5,
val3: 4,
val4: 1,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'NW',
val1: 0.1,
val2: 2.7,
val3: 2,
val4: 1,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'NNW',
val1: 0.3,
val2: 1.5,
val3: 1,
val4: 1,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}],
}, {
period: 'Nov. 1, 2012 - Dec. 1, 2012',
values: [{
arg: 'N',
val1: 0.7,
val2: 3,
val3: 8,
val4: 2,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'NNE',
val1: 0.4,
val2: 1.6,
val3: 2,
val4: 1,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'NE',
val1: 0.5,
val2: 3.4,
val3: 8,
val4: 2,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'ENE',
val1: 0.3,
val2: 4.1,
val3: 2,
val4: 0,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'E',
val1: 1.2,
val2: 1.8,
val3: 0,
val4: 0,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'ESE',
val1: 0.7,
val2: 0.3,
val3: 0,
val4: 0,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'SE',
val1: 0.1,
val2: 0.3,
val3: 0,
val4: 0,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'SSE',
val1: 0.3,
val2: 0.4,
val3: 1,
val4: 0,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'S',
val1: 0.4,
val2: 0.8,
val3: 1,
val4: 0,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'SSW',
val1: 0.4,
val2: 1.5,
val3: 0,
val4: 0,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'SW',
val1: 0.8,
val2: 0.1,
val3: 1,
val4: 0,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'WSW',
val1: 0,
val2: 1.5,
val3: 2,
val4: 1,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'W',
val1: 0.3,
val2: 1,
val3: 6,
val4: 3,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'WNW',
val1: 0.3,
val2: 1.2,
val3: 3,
val4: 1,
val5: 1,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'NW',
val1: 0.3,
val2: 0.7,
val3: 5,
val4: 2,
val5: 0,
val6: 0,
val7: 0,
val8: 0,
}, {
arg: 'NNW',
val1: 0.1,
val2: 2.5,
val3: 2,
val4: 2,
val5: 1,
val6: 0,
val7: 0,
val8: 0,
}],
}];
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.2.5/css/dx.light.css" />
<script src="https://unpkg.com/typescript@4.2.4/lib/typescript.js"></script>
<script type="module">
import * as vueCompilerSFC from "https://unpkg.com/@vue/compiler-sfc@3.3.4/dist/compiler-sfc.esm-browser.js";
window.vueCompilerSFC = vueCompilerSFC;
</script>
<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.ts");
</script>
</head>
<body class="dx-viewport">
<div class="demo-container">
<div id="app"> </div>
</div>
</body>
</html>