记录生活中的点滴,分享、学习、创新
本文实例讲述了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 
		*
	 
		
		
		
	 |