饼图----插件

(function( w ) {
// 角度转换为弧度
function angleToRadian( angle ) {
return Math.PI / 180 * angle;
}

/*
* constructor { PipeChart } 饼图构造函数
* param { ctx: Context } 绘图上下文
* param { data: Array } 绘制饼图所需的数据
* param { x: number } 圆心x坐标
* param { y: number } 圆心y坐标
* param { r: number } 饼图半径
* */
function PipeChart( ctx, data, x, y, r ) {

this.ctx = ctx;
this.data = data;
this.x = x;
this.y = y;
this.r = r;

// 文字衬托线到圆的距离
this.lineSpace = 20;

// 扇形和文字的杨色
this.colors =

‘blue,hotpink,green,deeppink,ivory,skyblue,lavender,lavenderblush‘

.split(‘,‘);

// 把数据转换为对应的角度
this.processData();
}

// 置换原型
PipeChart.prototype = {

constructor: PipeChart,

// 绘制饼图
draw: function() {
this.drawPipe();
this.drawText();
},

// 根据数据转换成对应的角度
processData: function() {
/*
* 实现思路:
* 1、求单位数据所占用的角度 ==> 360 / 数据总和
* 2、使用单位数据所占用角度 * 每一份数据值得到每一份

数据所占用的角度
* 3、把计算好的角度使用一个数据存储起来,供其他方法使


* */
var self = this;

// 求数据总和
var num = 0;
this.data.forEach( function( obj ) {
num += obj.val;
});

// 求单位数据所占用的角度
var unitAngle = 360 / num;

// 用来存储数据所占用饼图的角度
this.processArr = [];

this.data.forEach( function( obj ) {
// 这里的this不是饼图实例,所以使用self
self.processArr.push( unitAngle * obj.val );
});
},

// 绘制饼中的扇
drawPipe: function() {

// 扇形默认起点和结束点
var startAngle = 0;
var endAngle = 0;

/*
* 实现思路:
* 1、遍历所有计算好的角度
* 2、beginPath、moveTo到饼图圆心
* 3、画对应扇形的弧
* 3.1、弧的起点位置 = 上一个弧的结束点
* 3.2、弧的结束点位置 = 上一个弧的结束点 + 自己的角度
* 4、closePath
* 5、修改填充色
* 6、fill
* */

// 遍历所有计算好的角度,绘制成不同颜色的扇形
for( var i = 0, len = this.processArr.length; i < len;

i++ ) {

// 当前扇形弧的起点位置 = 上一个扇形弧的结束点
// 当前扇形弧的结束点位置 = 上一个扇形弧的结束点 +

自己扇形所占用的角度
startAngle = endAngle;
endAngle = endAngle + this.processArr[i];

this.ctx.beginPath();
this.ctx.moveTo( this.x, this.y );
this.ctx.arc( this.x, this.y, this.r,

angleToRadian( startAngle ), angleToRadian( endAngle ) );
this.ctx.closePath();
this.ctx.fillStyle = this.colors[ i ];
this.ctx.fill();
}
},

// 绘制文字
drawText: function() {

// 扇形默认起点和结束点
var startAngle = 0;
var endAngle = 0;

// 扇形平分线的角度
var lineAngle = 0;
var lineX = 0;
var lineY = 0;

// 遍历所有计算好的角度,绘制成不同颜色的扇形
for( var i = 0, len = this.processArr.length; i < len;

i++ ) {

// 当前扇形弧的起点位置 = 上一个扇形弧的结束点
// 当前扇形弧的结束点位置 = 上一个扇形弧的结束点 +

自己扇形所占用的角度
startAngle = endAngle;
lineAngle = startAngle + this.processArr[i] / 2;
endAngle = endAngle + this.processArr[i];

/*
* 求平分线的x&y坐标
* x: 圆心x + r * Math.cos( angleToRadian(45) )
* y: 圆心y + r * Math.sin( angleToRadian(45) )
* */
lineX = this.x + (this.r + this.lineSpace) *

Math.cos( angleToRadian(lineAngle) );
lineY = this.y + (this.r + this.lineSpace) *

Math.sin( angleToRadian(lineAngle) );

// 画扇形平分线
this.ctx.beginPath();
this.ctx.moveTo( this.x, this.y );
this.ctx.lineTo( lineX, lineY );
this.ctx.strokeStyle = this.colors[i];
this.ctx.stroke();

// 添加文字描述
if( lineAngle >= 90 & lineAngle <= 270 ) {
this.ctx.textAlign = ‘right‘;
this.ctx.moveTo( lineX, lineY );
this.ctx.lineTo( lineX - this.ctx.measureText(

this.data[i].msg ).width, lineY );
}else {
this.ctx.textAlign = ‘left‘;
this.ctx.moveTo( lineX, lineY );
this.ctx.lineTo( lineX + this.ctx.measureText(

this.data[i].msg ).width, lineY );
}
this.ctx.textBaseline = ‘bottom‘;
this.ctx.fillStyle = this.colors[i];
this.ctx.fillText( this.data[i].msg, lineX, lineY

- 5 );
this.ctx.stroke();
}
}
};

// 给原型添加一个饼图插件方法
jQuery.fn.extend({

// 在第一个元素中,按照指定的数据绘制饼图
pipeChart: function( data ) {
/*
* 实现思路:
* 1、动态创建canvas元素,并且获取绘图环境
* 2、获取第一个元素的大小,按照这个大小动态设置画布的

大小
* 3、创建饼图对象,调用draw方法绘制
* 4、把绘制好的画布添加到第一个元素中
* */

// 创建canvas,获取ctx
var $cvs = $(‘<canvas></canvas>‘);
var ctx = $cvs.get(0).getContext( ‘2d‘ );

var $first = this.first();
var width = parseInt( $first.css( ‘width‘ ) );
var height = parseInt( $first.css( ‘height‘ ) );

// 根据元素大小动态设置画布大小
$cvs.attr({
width: width,
height: height
});

// 计算饼图半径,圆心
var r = width > height? height / 2: width / 2;
var x = width / 2;
var y = height / 2;

// 根据数据绘制饼图
var pipeChart = new PipeChart( ctx, data, x, y, r - 50

);
pipeChart.draw();

// 把绘制好的画布添加到第一个元素中
$first.append( $cvs );
}
})

}( window ));

时间: 2024-08-06 03:35:43

饼图----插件的相关文章

canvas 模仿highcharts自制饼图插件

最近一直在学习canvas,之前工作中经常用到highcharts,于是想着用canvas画一个饼图.制作成插件 对于js可直接引入.使用起来方便 1.引入js <script type='text/javascript' src="jquery.min.js"></script> <script type='text/javascript' src="pie.js"></script> 2.要插入饼图的区域 <

centos7.4_x86_64安装grafana5.2.1并安装常用zabbix插件

获取并安装grafana5.2.1# wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-5.2.1-1.x86_64.rpm # yum localinstall -y grafana-5.2.0-1.x86_64.rpm 服务端图像呈现组件安装yum install fontconfig freetype* urw-fonts -y 开启系统默认启动systemctl enable grafana-

grafana数据迁移

grafana是用于可视化大型测量数据的开源程序.界面比kibana更加美观,适合在电视展示! 最近grafana更新到4.0版本,增加了报警功能.正好grafana需要迁移,就升级迁移一起搞定. 具体操作: wget  https://grafanarel.s3.amazonaws.com/builds/grafana-4.0.2-1481203731.x86_64.rpm yum install initscripts fontconfig rpm -Uvh grafana-4.0.2-14

10款web前端基于Jquery的动画源码

1.使用 CSS3 动感的图片标题动画效果 在网站中,有很多地方会需要在图片上显示图片标题.使用 CSS3 过渡和变换可以实现动感的鼠标悬停显示效果.没有使用 JavaScript,所以只能在支持 CSS3 动画的现代浏览器中才能正常工作.您可以查看网页的源代码,了解动画是如何工作的. 在线演示 源码下载 2.简单的轻量级的 jQuery 仪表板插件 sDashboard 是一个轻量的仪表板 jQuery 插件,转换一个对象数组到仪表板.数组中的每个对象将被呈现为一个仪表板组件,可以通过左右拖

使用 Grafana、collectd 和 InfluxDB 打造现代监控系统

使用 Grafana.collectd 和 InfluxDB 打造现代监控系统 先给小伙伴们秀一下由grafana画出的监控效果图 想打造 New Relic 那样漂亮的实时监控系统我们只需要 InfluxDB/collectd/Grafana 这三个工具,这三个工具的关系是这样的: 采集数据(collectd)-> 存储数据(influxdb) -> 显示数据(grafana) InfluxDB 是 Go 语言开发的一个开源分布式时序数据库,非常适合存储指标.事件.分析等数据,看版本号(v0

阿里云ECS部署Grafana接入zabbix

原文链接 摘要: Grafana接入zabbix部署 阿里云ECS部署Grafana接入zabbix Grafana 是 Graphite 和 InfluxDB 仪表盘和图形编辑器.Grafana 是开源的,功能齐全的度量仪表盘和图形编辑器,支持 Graphite,InfluxDB 和 OpenTSDB. Grafana接入zabbix部署 阿里云ECS部署Grafana接入zabbix Grafana 是 Graphite 和 InfluxDB 仪表盘和图形编辑器.Grafana 是开源的,功

JMeter - 实时结果 - InfluxDB和Grafana - 第1部分 - 基本设置

概述: 在本文中,我将解释如何使用JMeter + InfluxDB + Grafana获得实时性能测试结果. 请注意,此主题太大,无法涵盖一篇文章中的所有内容.所以,我试图提供与TestAutomationGuru的其他文章的链接,这些文章可能与本文有关.请尽可能检查一切. 问题陈述: 多年前,当我以前运行JMeter测试时,我无法理解测试执行期间应用程序的性能.我总是不得不等待测试完成.这有点烦人 - 特别是在长时间运行的测试中.有时,我可能不得不连续2/3天进行浸泡测试. 在某些时候,JM

node exporter完整版

#(1)安装node exporter node exporter 作用: 是收集操作系统的基本系统, 例如cpu, 内存, 硬盘空间等基本信息, 并对外提供api接口用于prometheus查询存储; 1)docker方式运行node exporter docker run -d --name node-exporter -p 9100:9100 -v "/proc:/host/proc:ro" -v "/sys:/host/sys:ro" -v "/:

Grafana基础

一.Grafana基础 Grafana是一个开源的指标量监测和可视化工具.官方网站为:https://grafana.com/, 常用于展示基础设施的时序数据和应用程序运行分析.Grafana的dashboard展示非常炫酷,绝对是运维提升逼格的一大利器. 官方在线的demo可以在这里找到: http://play.grafana.org/ Grafana是一个通用的可视化工具.这意味着Grafana不仅仅适用于展示zabbix下的监控数据,也同样适用于一些其他的数据可视化需求.在开始使用Gra