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
import React from 'react';
import SelectBox from 'devextreme-react/select-box';
import {
PolarChart,
CommonSeriesSettings,
Series,
ArgumentAxis,
ValueAxis,
Margin,
Export,
} from 'devextreme-react/polar-chart';
import { windSources, windRoseData, periodLabel } from './data.js';
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
periodValues: windRoseData[0].values,
};
this.handleChange = this.handleChange.bind(this);
}
render() {
return (
<div id="chart-demo">
<PolarChart
id="radarChart"
palette="Soft"
dataSource={this.state.periodValues}
onLegendClick={this.onLegendClick}
title="Wind Rose, Philadelphia PA"
>
<CommonSeriesSettings type="stackedbar" />
{
windSources.map((item) => <Series
key={item.value}
valueField={item.value}
name={item.name} />)
}
<Margin
bottom={50}
left={100}
/>
<ArgumentAxis
discreteAxisDivisionMode="crossLabels"
firstPointOnStartAngle={true}
/>
<ValueAxis valueMarginsEnabled={false} />
<Export enabled={true} />
</PolarChart>
<div className="center">
<SelectBox
width="300"
dataSource={windRoseData}
inputAttr={periodLabel}
displayExpr="period"
valueExpr="values"
value={this.state.periodValues}
onValueChanged={this.handleChange}
/>
</div>
</div>
);
}
onLegendClick({ target: series }) {
if (series.isVisible()) {
series.hide();
} else {
series.show();
}
}
handleChange({ value }) {
this.setState({ periodValues: value });
}
}
export default App;
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App.js';
ReactDOM.render(
<App />,
document.getElementById('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" />
<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.js");
</script>
</head>
<body class="dx-viewport">
<div class="demo-container">
<div id="app"></div>
</div>
</body>
</html>
#chart-demo {
height: 600px;
}
#radarChart {
height: 500px;
}
#chart-demo > .center {
text-align: center;
}
#chart-demo > .center > .dx-widget {
display: inline-block;
vertical-align: middle;
}
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,
}],
}];
export const periodLabel = { 'aria-label': 'Period' };
window.exports = window.exports || {};
window.config = {
transpiler: 'plugin-babel',
meta: {
'devextreme/localization.js': {
'esModule': true,
},
},
paths: {
'npm:': 'https://unpkg.com/',
},
defaultExtension: 'js',
map: {
'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@15.8.1/prop-types.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-react': 'npm:devextreme-react@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',
// 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.4/standalone.js',
'prettier/parser-html': 'npm:prettier@2.8.4/parser-html.js',
},
packages: {
'devextreme': {
defaultExtension: 'js',
},
'devextreme-react': {
main: 'index.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,
react: true,
},
};
System.config(window.config);