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
<div id="chart-demo">
<dx-polar-chart
#chart
id="radarChart"
palette="soft"
title="Wind Rose, Philadelphia PA"
[dataSource]="windRoseData[0].values"
(onLegendClick)="onLegendClick($event)"
>
<dxi-series
*ngFor="let item of windSources"
[valueField]="item.valueField"
[name]="item.name"
>
</dxi-series>
<dxo-common-series-settings type="stackedbar"></dxo-common-series-settings>
<dxo-margin [bottom]="50" [left]="100"> </dxo-margin>
<dxo-argument-axis
discreteAxisDivisionMode="crossLabels"
[firstPointOnStartAngle]="true"
>
</dxo-argument-axis>
<dxo-value-axis [valueMarginsEnabled]="false"></dxo-value-axis>
<dxo-export [enabled]="true"></dxo-export>
</dx-polar-chart>
<div class="center">
<dx-select-box
[dataSource]="windRoseData"
displayExpr="period"
[inputAttr]="{ 'aria-label': 'Period' }"
valueExpr="values"
[(value)]="chart.dataSource"
[width]="300"
>
</dx-select-box>
</div>
</div>
import { NgModule, Component, enableProdMode } from '@angular/core';
import { BrowserModule, BrowserTransferStateModule } from '@angular/platform-browser';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { DxPolarChartModule, DxSelectBoxModule } from 'devextreme-angular';
import { WindRose, WindDescription, Service } from './app.service';
if (!/localhost/.test(document.location.host)) {
enableProdMode();
}
@Component({
selector: 'demo-app',
templateUrl: 'app/app.component.html',
styleUrls: ['app/app.component.css'],
providers: [Service],
})
export class AppComponent {
windRoseData: WindRose[];
windSources: WindDescription[];
constructor(service: Service) {
this.windRoseData = service.getWindRoseData();
this.windSources = service.getWindSources();
}
onLegendClick(e: any) {
const series = e.target;
if (series.isVisible()) {
series.hide();
} else {
series.show();
}
}
}
@NgModule({
imports: [
BrowserModule,
BrowserTransferStateModule,
DxPolarChartModule,
DxSelectBoxModule,
],
declarations: [AppComponent],
bootstrap: [AppComponent],
})
export class AppModule { }
platformBrowserDynamic().bootstrapModule(AppModule);
::ng-deep #chart-demo {
height: 600px;
}
::ng-deep #radarChart {
height: 500px;
}
::ng-deep #chart-demo > .center {
text-align: center;
}
::ng-deep #chart-demo > .center > .dx-widget {
display: inline-block;
vertical-align: middle;
}
import { Injectable } from '@angular/core';
export interface WindValue {
arg: string;
val1: number;
val2: number;
val3: number;
val4: number;
val5: number;
val6: number;
val7: number;
val8: number;
}
export interface WindRose {
period: string;
values: WindValue[];
}
export class WindDescription {
valueField: string;
name: string;
}
const windSources: WindDescription[] = [
{ valueField: 'val1', name: '1.3-4 m/s' },
{ valueField: 'val2', name: '4-8 m/s' },
{ valueField: 'val3', name: '8-13 m/s' },
{ valueField: 'val4', name: '13-19 m/s' },
{ valueField: 'val5', name: '19-25 m/s' },
{ valueField: 'val6', name: '25-32 m/s' },
{ valueField: 'val7', name: '32-39 m/s' },
{ valueField: 'val8', name: '39-47 m/s' },
];
const windRoseData: WindRose[] = [{
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,
}],
}];
@Injectable()
export class Service {
getWindRoseData() {
return windRoseData;
}
getWindSources() {
return windSources;
}
}
// In real applications, you should not transpile code in the browser.
// You can see how to create your own application with Angular and DevExtreme here:
// https://js.devexpress.com/Documentation/Guide/Angular_Components/Getting_Started/Create_a_DevExtreme_Application/
window.exports = window.exports || {};
window.config = {
transpiler: 'ts',
typescriptOptions: {
module: 'system',
emitDecoratorMetadata: true,
experimentalDecorators: true,
},
meta: {
'typescript': {
'exports': 'ts',
},
'devextreme/localization.js': {
'esModule': true,
},
},
paths: {
'npm:': 'https://unpkg.com/',
},
map: {
'ts': 'npm:plugin-typescript@4.2.4/lib/plugin.js',
'typescript': 'npm:typescript@4.2.4/lib/typescript.js',
'@angular/core': 'npm:@angular/core@12.2.17',
'@angular/platform-browser': 'npm:@angular/platform-browser@12.2.17',
'@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic@12.2.17',
'@angular/forms': 'npm:@angular/forms@12.2.17',
'@angular/common': 'npm:@angular/common@12.2.17',
'@angular/compiler': 'npm:@angular/compiler@12.2.17',
'tslib': 'npm:tslib@2.3.1/tslib.js',
'rxjs': 'npm:rxjs@7.5.3/dist/bundles/rxjs.umd.js',
'rxjs/operators': 'npm:rxjs@7.5.3/dist/cjs/operators/index.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/bundles/dx.all': 'npm:devextreme@23.1.6/bundles/dx.all.js',
'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',
'devexpress-gantt': 'npm:devexpress-gantt@4.1.49',
'devextreme-angular': 'npm:devextreme-angular@23.1.6',
'@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',
// Prettier
'prettier/standalone': 'npm:prettier@2.8.4/standalone.js',
'prettier/parser-html': 'npm:prettier@2.8.4/parser-html.js',
},
packages: {
'app': {
main: './app.component.ts',
defaultExtension: 'ts',
},
'devextreme': {
defaultExtension: 'js',
},
'devextreme/events/utils': {
main: 'index',
},
'devextreme/events': {
main: 'index',
},
'es6-object-assign': {
main: './index.js',
defaultExtension: 'js',
},
'rxjs': {
defaultExtension: 'js',
},
'rxjs/operators': {
defaultExtension: 'js',
},
},
packageConfigPaths: [
'npm:@devextreme/*/package.json',
'npm:@devextreme/runtime@3.0.12/inferno/package.json',
'npm:@angular/*/package.json',
'npm:@angular/common@12.2.17/*/package.json',
'npm:rxjs@7.5.3/package.json',
'npm:rxjs@7.5.3/operators/package.json',
'npm:devextreme-angular@23.1.6/*/package.json',
'npm:devextreme-angular@23.1.6/ui/*/package.json',
'npm:devextreme-angular@23.1.6/package.json',
'npm:devexpress-diagram@2.2.2/package.json',
'npm:devexpress-gantt@4.1.49/package.json',
],
};
System.config(window.config);
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<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/zone.js@0.12.0/dist/zone.js"></script>
<script src="https://unpkg.com/reflect-metadata@0.1.13/Reflect.js"></script>
<script src="https://unpkg.com/systemjs@0.21.3/dist/system.js"></script>
<script src="config.js"></script>
<script>
System.import("app").catch(console.error.bind(console));
</script>
</head>
<body class="dx-viewport">
<div class="demo-container">
<demo-app>Loading...</demo-app>
</div>
</body>
</html>