记录生活中的点滴,分享、学习、创新
本文实例讲述了Angular2使用SVG自定义图表(条形图、折线图)组件。分享给大家供大家参考,具体如下:
要求:用户将数据作为参数传进来,通过类型决定渲染何种类型的图标。
demo:
html:
1 | < ngo-chart [inputParams]="options"></ ngo-chart > |
ts:
1 2 3 4 5 6 7 8 9 10 11 12 | options = { type: 'line' , //图表类型 xAxis: { //X轴的数据 data: [ 'Mon' , 'Tue' , 'Wed' , 'Thu' , 'Fri' , 'Sat' , 'Sun' ] }, yAxis: { //X轴的数据 data: [120, 220, 150, 111, -150, 55, 60], }, width: 600, //宽 height: 500, //高 dataPadding: 8 //条形图之间的距离 }; |
效果:
源代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | import { Input, OnInit, ViewChild, Component, ViewEncapsulation, ElementRef, AfterViewInit, ChangeDetectorRef, } from '@angular/core' ; import { NgoChartSvgParams, Scale, Axis, Chart } from './chart-svg-params' ; @Component({ selector: 'ngo-chart-svg' , templateUrl: './chart-svg.html' , styleUrls: [ './chart-svg.scss' ], encapsulation: ViewEncapsulation.Native }) export class NgoChartSvg implements OnInit, AfterViewInit { @Input() inputParams: NgoChartSvgParams; @ViewChild( 'svg' ) svg: ElementRef; @ViewChild( 'polyline' ) polyline: ElementRef; params: NgoChartSvgParams; AxisY: Axis; // Y轴 AxisX: Axis; // X轴 valueToPxRatio: number; // 值转px的比率 Y0: number; // 坐标轴 (0,0)的Y轴 Yscale: Array<Scale> = []; // Y轴刻度值 Xscale: Array<Scale> = []; // X轴刻度值 XgapWidth: number; // X轴刻度之间的间隙宽度 data: Array<Chart> = []; color: string; type: string; polyLinePoints: string; polyLineLength: number; constructor( private ele: ElementRef, private cd: ChangeDetectorRef ) { } ... ngOnInit() { this .initParams(); const svg = this .svg.nativeElement; const _width = this .params.width; const _height = this .params.height; svg.setAttribute( 'width' , _width); svg.setAttribute( 'height' , _height); // 绘制 y轴 this .drawAxisY(); this .drawScaleY(); // 绘制 x轴 this .drawAxisX(); this .drawScaleX(); this .drawRect(); if ( this .params.type === 'line' ) { this .drawLine(); } } ngAfterViewInit() { if ( this .polyline) { this .polyLineLength = this .polyline.nativeElement.getTotalLength(); this .cd.detectChanges(); } } } |
html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | < svg #svg> <!-- Y轴 --> < g > < line [attr.x1]="AxisY.x1" [attr.y1]="AxisY.y1+15" [attr.x2]="AxisY.x2" [attr.y2]="AxisY.y2" [attr.stroke]="color" [attr.fill]="color" style = "stroke-width:3" /> < polygon [attr.points]="AxisY.arrow" /> < ng-container * ngFor = "let scale of Yscale" > < line
*
|