亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Angular2使用SVG自定義圖表(條形圖、折線圖)組件示例

2019-11-19 11:36:40
字體:
供稿:網(wǎng)友

本文實(shí)例講述了Angular2使用SVG自定義圖表(條形圖、折線圖)組件。分享給大家供大家參考,具體如下:

要求:用戶將數(shù)據(jù)作為參數(shù)傳進(jìn)來,通過類型決定渲染何種類型的圖標(biāo)。

demo:

html:

<ngo-chart [inputParams]="options"></ngo-chart>

ts:

 options = {    type: 'line',   //圖表類型    xAxis: {      //X軸的數(shù)據(jù)      data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']    },    yAxis: {      //X軸的數(shù)據(jù)      data: [120, 220, 150, 111, -150, 55, 60],    },    width: 600,    //寬    height: 500,    //高    dataPadding: 8   //條形圖之間的距離  };

效果:

源代碼:

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; // 值轉(zhuǎn)px的比率  Y0: number; // 坐標(biāo)軸 (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

<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 class="dash" [attr.x1]="scale.x1" [attr.x2]="scale.x2" [attr.y1]="scale.y1" [attr.y2]="scale.y2" stroke="rgba(0,0,0,0.3)"      />      <text class="_label" [attr.x]="scale.x1-5" style="text-anchor: end" [attr.y]="scale.y1" [attr.fill]="color" [attr.fill]="color">{{scale.label}}</text>    </ng-container>  </g>  <!-- X軸 -->  <g>    <line [attr.x1]="AxisX.x1-15" [attr.x2]="AxisX.x2" [attr.y1]="AxisX.y1" [attr.y2]="AxisX.y2" [attr.stroke]="color" [attr.fill]="color"      style="stroke-width:3" />    <polygon [attr.points]="AxisX.arrow" />    <ng-container *ngFor="let scale of Xscale">      <line [attr.x1]="scale.x1" [attr.x2]="scale.x2" [attr.y1]="scale.y1" [attr.y2]="scale.y2" [attr.stroke]="color" [attr.fill]="color"        style="stroke-width:1" />      <text class="_label" [attr.x]="scale.x1-XgapWidth/2" [attr.y]="AxisY.y1+15" [attr.fill]="color" style="text-anchor: middle;">{{scale.label}}</text>    </ng-container>  </g>  <!-- 矩形 -->  <ng-container *ngIf="type==='bar'">    <text x="10" y="20" fill="red">bar</text>    <g>      <ng-container *ngFor="let item of data">        <ng-container *ngIf="item.value<=0">          <rect class="_rect" [attr.x]="item.x" [attr.y]="item.y" [attr.width]="item.w" [attr.height]="item.h" fill="color">            <animate attributeName="height" [attr.from]="item.h*0.6" [attr.to]="item.h" begin="0s" dur="1.1s" />          </rect>          <text [attr.x]="item.x+item.w/2" [attr.y]="item.y+item.h-5" fill="white" style="text-anchor: middle;">{{item.value}}</text>        </ng-container>        <ng-container *ngIf="item.value>0">          <rect [attr.x]="item.x" [attr.y]="item.y" [attr.width]="item.w" [attr.height]="item.h" fill="color">            <animate attributeName="y" [attr.from]="item.y+item.h*0.4" [attr.to]="item.y" begin="0s" dur="1.1s" />            <animate attributeName="height" [attr.from]="item.h*0.6" [attr.to]="item.h" begin="0s" dur="1.1s" />          </rect>          <text class="_label" [attr.x]="item.x+item.w/2" [attr.y]="item.y+18" fill="white" style="text-anchor: middle;">{{item.value}}            <animate attributeName="opacity" from="0" to="1" begin="0s" dur="1.1s" />          </text>        </ng-container>      </ng-container>    </g>  </ng-container>  <!--折線 -->  <ng-container *ngIf="type==='line'">    <text x="10" y="20" fill="red">line</text>    <g>      <polyline #polyline class="_polyline" [attr.points]="polyLinePoints" fill="none" [attr.stroke]='color' [attr.stroke-dasharray]="polyLineLength"        [attr.stroke-dashoffset]="polyLineLength" />      <ng-container *ngFor="let item of data">        <circle [attr.cx]="item.x+item.w/2" [attr.cy]="item.y" r="2" [attr.fill]="color" [attr.stroke]='color' />        <text class="_label" [attr.x]="item.x+item.w/2" [attr.y]="item.y+20" fill="white" style="text-anchor: middle;">{{item.value}}          <animate attributeName="opacity" from="0" to="1" begin="0s" dur="1.1s" />        </text>      </ng-container>    </g>  </ng-container></svg>

css

svg { background: rgba(0, 0, 0, 0.2); border: 1px solid black;}svg * { position: static; font-size: 16px;}._polyline { fill: none; animation: lineMove 1.5s ease-in-out forwards;}@keyframes lineMove { to {  stroke-dashoffset: 0; }}

一、初始化參數(shù)

//首先獲取傳入的參數(shù) @Input() inputParams;//初始化 const _params: NgoChartSvgParams = {   xAxis: this.inputParams.xAxis,   yAxis: this.inputParams.yAxis,   type: this.inputParams.type ? this.inputParams.type : 'bar',   width: this.inputParams.width ? this.inputParams.width : 700,   height: this.inputParams.height ? this.inputParams.height : 500,   dataPadding: this.inputParams.dataPadding !== undefined ? this.inputParams.dataPadding : 8,   YscaleNo: this.inputParams.YscaleNo >= 3 ? this.inputParams.YscaleNo : 6,};this.color = 'black';this.type = _params.type;this.params = _params;

二:繪制坐標(biāo)軸Y軸

const _height = this.params.height;const _pad = this.params.padding;const _arrow = _pad + ',' + (_pad - 5) + ' ' + (_pad - 6) + ',' + (_pad + 12) + ' ' + (_pad + 6) + ',' + (_pad + 12); this.AxisY = {   x1: _pad,   y1: _height - _pad,   x2: _pad,   y2: _pad,   arrow: _arrow};

三、繪制Y軸的刻度

const _height = this.params.height;const _width = this.params.width;// 顯示label的邊距const _padding = this.params.padding;const _Ydata = this.params.yAxis.data;// 顯示的刻度數(shù)const _YscaleNo = this.params.YscaleNo;const _dataMax = this.getMinAndMaxData(_Ydata).dataMax;const _dataMin = this.getMinAndMaxData(_Ydata).dataMin;let _YminValue;let _YgapValue;if (_dataMin < 0) {   _YgapValue = Math.ceil((_dataMax - _dataMin) / (_YscaleNo) / 10) * 10;   _YminValue = Math.floor(_dataMin / _YgapValue) * _YgapValue;} else {   _YgapValue = Math.ceil((_dataMax) / (_YscaleNo) / 10) * 10;   _YminValue = 0;}// Y軸坐標(biāo)點(diǎn)const _y2 = this.AxisY.y2;const _y1 = this.AxisY.y1;const _x1 = this.AxisY.x1;// Y軸刻度的間隙寬度const _YgapWidth = (_y1 - _y2) / (this.params.YscaleNo);this.valueToPxRatio = _YgapValue / _YgapWidth;// 坐標(biāo)軸(0,0)的Y軸坐標(biāo)const _Y0 = _y1 - Math.abs(_YminValue / this.valueToPxRatio);this.Y0 = _Y0;for (let i = 0; i < this.params.YscaleNo; i++) {   const _obj: Scale = { x1: 0, x2: 0, y1: 0, y2: 0, label: '', value: 0 };   _obj.x1 = _x1;   _obj.y1 = _y1 - _YgapWidth * i;   _obj.x2 = _x1 + _width - 2 * _padding;   _obj.y2 = _y1 - _YgapWidth * i;   _obj.label = _YminValue + _YgapValue * i;   this.Yscale.push(_obj);}

四、繪制X坐標(biāo)軸

const _width = this.params.width;// 顯示label的邊距const _pad = this.params.padding;const _x2 = _width - _pad;const _y2 = this.Y0;const _arrow = (_x2 + 5) + ',' + _y2 + ' ' + (_x2 - 10) + ',' + (_y2 - 6) + ' ' + (_x2 - 10) + ',' + (_y2 + 6);this.AxisX = {  x1: _pad,  y1: _y2,  x2: _x2,  y2: _y2,  arrow: _arrow};

五、繪制X軸刻度

const _width = this.params.width;const _Xdata = this.params.xAxis.data;const _Ydata = this.params.yAxis.data;const Y0 = this.Y0;const _x1 = this.AxisX.x1;const _x2 = this.AxisX.x2;const XgapWidth = ((_x2 - _x1) / (this.params.xAxis.data.length + 1));this.XgapWidth = XgapWidth;for (let i = 0; i < _Xdata.length; i++) {   const _obj: Scale = { x1: 0, x2: 0, y1: 0, y2: 0, value: 0, label: '' };   _obj.y1 = Y0;   _obj.y2 = Y0 + 5;   _obj.label = _Xdata[i];   _obj.value = _Ydata[i];   _obj.x1 = _x1 + XgapWidth * (i + 1);   _obj.x2 = _x1 + XgapWidth * (i + 1);   this.Xscale.push(_obj);

六、繪制矩形

const _value = this.params.yAxis.data;const _dataPadding = this.params.dataPadding;const _XgapWidth = this.XgapWidth;for (let i = 0; i < _value.length; i++) {   const element = _value[i];   const _obj: Chart = { x: 0, y: 0, w: 0, h: 0, value: 0 };   _obj.w = _XgapWidth - 2 * _dataPadding;   _obj.x = this.Xscale[i].x1 - _obj.w - _dataPadding;   _obj.h = Math.abs(this.Xscale[i].value / this.valueToPxRatio);   _obj.value = this.Xscale[i].value;   if (this.Xscale[i].value >= 0) {      _obj.y = this.Y0 - (this.Xscale[i].value) / this.valueToPxRatio;   } else {      _obj.y = this.Y0;   }      this.data.push(_obj);   }}

七、繪制折線

const _data = this.data;let _str = '';_data.forEach(ele => {if (ele.value < 0) {   ele.y = ele.y + ele.h;}   _str += (ele.x + ele.w / 2) + ',' + ele.y + ' ';});this.polyLinePoints = _str;

更多關(guān)于AngularJS相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《AngularJS指令操作技巧總結(jié)》、《AngularJS入門與進(jìn)階教程》及《AngularJS MVC架構(gòu)總結(jié)

希望本文所述對大家AngularJS程序設(shè)計(jì)有所幫助。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
九色视频在线观看| 91香蕉视频污| 岛国一区二区三区高清视频| 色综合久综合久久综合久鬼88| 日本我和搜子同居的日子高清在线| 中文字幕の友人北条麻妃| eeuss影院在线观看| 亚洲国产一区二区三区在线播放| 亚洲男人第一天堂| 丁香花在线电影小说观看| 久热re这里精品视频在线6| 性色av蜜臀av| 午夜国产欧美理论在线播放| 精品中文字幕乱| 蜜桃视频一日韩欧美专区| 91精品国产入口| 青青草精品视频在线| 麻豆蜜桃在线观看| 9久草视频在线视频精品| 黑人中文字幕一区二区三区| 亚洲综合欧美色图| 欧美欧美欧美欧美首页| 色欲av永久无码精品无码蜜桃| 97视频在线看| 亚洲a在线视频| 99精品免费| 色悠久久久久综合网小说| 97人人模人人爽人人喊中文字| 中文字幕一区二区三区人妻在线视频| heyzo在线欧美播放| 免费观看一级视频| 国产日产欧美一区二区三区| www.4hu95.com四虎| 国产成人综合亚洲欧美在| 91香蕉视频污| 亚洲欧美变态国产另类| 成人免费在线观看网站| 国产91在线播放| 久久久综合精品| 欧美日韩一区二区不卡| 波多野结衣在线观看一区二区三区| 国产suv精品一区二区四区视频| 最近国语视频在线观看免费播放| 日本强好片久久久久久aaa| 成人动漫视频| 久久亚洲精品国产亚洲老地址| 最近中文字幕mv免费高清视频8| 任我爽在线视频精品一| 在线观看精品一区| 污视频网站在线播放| 成人午夜精品在线| 在线观看av一区二区| 日韩欧美在线视频免费观看| 欧美午夜视频网站| 中日韩精品视频在线观看| 国产91色在线观看| 中文字幕资源网在线观看| 欧美色视频免费| 欧洲在线/亚洲| 污污视频网站在线免费观看| 羞羞网站免费观看| 中文字幕永久在线观看| 日韩美女一级视频| 99国产视频| 天天躁夜夜躁狠狠是什么心态| av中文字幕网| 欧美s码亚洲码精品m码| 国产亚洲高清一区| 视频一区三区| 激情综合激情| 一二三不卡视频| 欧美午夜a级限制福利片| 韩国19禁主播vip福利视频| www.涩涩爱| 红桃av永久久久| 亚洲国内精品视频| 毛片在线播放a| 成人激情视频| 国内精品不卡一区二区三区| 日韩精品专区在线影院重磅| 韩国三级中文字幕hd久久精品| 中文字幕色一区二区| 亚洲午夜久久久久久尤物| av噜噜色噜噜久久| 国产网站免费看| 欧美成年人视频网站| 国产精品久久久久久久7电影| 欧美大片aaa| 伊人222成人综合网| 成年人免费在线播放| 91欧美精品成人综合在线观看| 人在线成免费视频| 欧美电影h版| 免费看美女毛片| 欧美成人午夜免费视在线看片| 亚洲国产精久久久久久| 国产亲伦免费视频播放| 国产精品酒店视频| 国产欧美va欧美va香蕉在线| 国产成人精品在线| 第一av在线| 免费看欧美黑人毛片| 韩日电影在线观看| 欧美www视频在线观看| 国产啪精品视频| 国产日产精品_国产精品毛片| 欧美久久久久中文字幕| 中文视频一区| 国产精品你懂的在线欣赏| 日韩精品中文字幕第1页| 日韩精品一区二区三区| 亚洲图片在线视频| 无码一区二区三区在线| 日本成年免费网站| 成人性色生活片| av在线免费看片| 欧美区在线播放| 国产精品免费视频一区二区三区| 五月婷婷在线观看| 视频一区二区欧美| 久久一综合视频| 国产成人高清视频| 一代武则天秘史| 日韩中文欧美在线| 五月婷婷狠狠干| 女主播福利一区| 日韩大尺度黄色| 久久综合中文| 性欧美ⅴideo另类hd| 亚洲免费视频在线| 91久久精品一区二区二区| 免费黄网站在线播放| 久久精品日韩一区二区三区| 自拍偷拍视频在线| 色欲久久久天天天综合网| 亚洲欧洲日韩综合二区| 欧美性在线观看| 欧美国产亚洲一区| 欧美老女人在线视频| 亚洲综合网站| 日本欧美电影在线观看| 亚洲熟妇无码另类久久久| 中文日韩在线| 欧美日韩精品系列| 中文字幕日韩一区二区不卡| 国产67194| 性欧美.com| 高清av免费看| 青青草视频在线青草免费观看| 26uuu国产日韩综合| 成人一区二区视频| 国产成人愉拍精品久久| 黄色a在线观看| 日本人妻熟妇久久久久久| 久久精品国产99久久| av在线电影网| 高清乱码免费看污| 99久久婷婷国产一区二区三区| 亚洲国产成人av在线| 免费人成短视频在线观看网站| 国产精品福利观看| 右手影院亚洲欧美| 日本vs亚洲vs韩国一区三区二区| 国产成人亚洲一区二区三区| 亚洲va韩国va欧美va| 不卡日本视频| 18欧美亚洲精品| 免费在线观看精品| 欧美中日韩一区二区三区| 精品自拍视频| 国产精品一区在线播放| 国产精品久久久久久影院8一贰佰| 黑人巨大精品欧美| 精品一区二区三区欧美| 高清在线一区二区| 久久偷看各类女兵18女厕嘘嘘| www.国产免费| 亚洲一区二区三区四区中文字幕| 日本中文字幕中出在线| 亚洲一区二区三区三| 免费永久视频| 日本在线播放一二三区| 亚洲xxxx2d动漫1| 亚洲毛片aa| 成人看片毛片免费播放器| 麻豆视频一区二区| 加勒比视频一区| 久久6免费视频| 欧美一区二区三区喷汁尤物| 日韩视频网站在线观看| 中文字幕第八页| 亚洲国产精品女人久久久| 日韩亚洲天堂| 亚洲国产精品久久久久蝴蝶传媒| 久久riav二区三区| **欧美大码日韩| 久久se这里有精品| 午夜精品久久久久久久四虎美女版| 国产又爽又黄的视频| 波多野结衣视频观看| 色一情一乱一区二区| 国产一区二区三区朝在线观看| 欧美精品一区在线| 亚洲精品成人无码毛片| 性欧美1819| 久久综合九色综合欧美就去吻| 亚洲黄色免费看| jlzzjlzz国产精品久久| 国模极品一区二区三区| mm131亚洲精品| 人妻熟妇乱又伦精品视频| 久久av老司机精品网站导航| 人在线成免费视频| 国产精品三上| 韩国中文字幕av| 国产在线观看不卡| 国内精品久久久久影院一蜜桃| 人人妻人人澡人人爽久久av| 欧美日韩一区二区三区免费| 免费看日本一区二区| 九九九热精品免费视频观看网站| 亚洲欧美综合另类在线卡通| 亚洲少妇中文在线| 大型av综合网站| 久久免费看少妇高潮v片特黄| 国产精品亚洲lv粉色| 久久艹这里只有精品| 天堂精品在线视频| 国产羞羞视频在线观看| 亚洲1区2区3区视频| 日本精品一区二区三区在线播放| 蜜桃视频在线观看播放| av在线理伦电影| 国产日产精品1区| 国产传媒在线看| xnxx国产精品| 欧美va亚洲va日韩∨a综合色| 欧美精品在线观看播放| 中文字幕高清在线免费播放| av网站大全在线观看| 萌白酱视频在线| 台湾成人免费视频| 人妻内射一区二区在线视频| 九九热视频免费| 亚洲爽爆av| 成人在线视频你懂的| 二区视频在线观看| 亚洲欧美一级二级三级| 中文字幕av高清| 99久热re在线精彩视频| 欧美一区二区三区少妇| 天天综合网网欲色| 国产麻豆综合视频在线观看| 久久看片网站| 黑森林福利视频导航| 欧美性受xxxx白人性爽| 在线观看日韩专区| 色天使色偷偷av一区二区| 青春有你2免费观看完整版在线播放高清| 国产有色视频色综合| 奇米影视777在线欧美电影观看| 日本黄色网址大全| 久热精品在线视频| 久久99国产乱子伦精品免费| 国产高清免费av| 日韩一二三区在线观看| 免费观看一二区视频网站| 深田咏美在线x99av| 欧美激情在线免费观看| 国产精品男人爽免费视频1| 欧美日韩大陆一区二区| 亚洲图片在线视频| 久久久美女视频| av网站免费大全| 中文一区一区三区高中清不卡| 久久青青草原一区二区| 国产精品日韩在线播放| 日日骚一区二区网站| 91久久久久久久久久久久| 捆绑紧缚一区二区三区在线观看| 欧美午夜电影在线观看| 亚洲综合网在线观看| 在线观看色网站| 热久久最新地址| 天堂va在线高清一区| 欧美日韩在线成人| 一道本一区二区| 国产精品毛片视频| 免费的黄网站在线观看| 3d成人动漫网站| 成人精品一二三区| 91久久精品www人人做人人爽| 精品噜噜噜噜久久久久久久久试看| 亚洲婷婷丁香| 中文字幕亚洲在线观看| 一广人看www在线观看免费视频| 成人黄色av电影| 欧美伊人亚洲伊人色综合动图| 白天操夜夜操| 国产又大又黑又粗免费视频| 91色精品视频在线| 一二三四区在线| 99视频都是精品热在线播放| 正在播放木下凛凛xv99| 亚洲欧洲精品一区二区三区| 日韩成人三级| 久久精品国产亚洲高清剧情介绍| 色综久久综合桃花网| 18久久久久久| 午夜精品电影在线观看| 中文字幕成人在线观看| 欧洲精品99毛片免费高清观看| 一本久道在线| 国产精品日本一区二区三区在线| 91麻豆国产语对白在线观看| jizzjizzwww| 任你操视频在线观看| 精品国产一二三| 日本一道本久久| 日韩在线播放av| av一区二区三| 另类一区二区三区| 看女生喷水的网站在线观看| 日韩乱码人妻无码中文字幕久久| 中文字幕在线观看二区| 国产99视频精品免视看7| 国产一区亚洲二区三区| 亚洲国产精品123|