JavaScript 绘制饼图的示例


Posted in Javascript onFebruary 19, 2021

绘制效果

JavaScript 绘制饼图的示例

实现代码

JavaScript

var canvas = document.getElementById("mycanvas");
var w = window.innerWidth;
var h = window.innerHeight;
canvas.height = 1000;
canvas.width = 1400;
var ctx = canvas.getContext('2d');

var poppable = true;

var slices = [];

function shadeColor(color, percent) {
 var f = parseInt(color.slice(1), 16),
  t = percent < 0 ? 0 : 255,
  p = percent < 0 ? percent * -1 : percent,
  R = f >> 16,
  G = f >> 8 & 0x00FF,
  B = f & 0x0000FF;
 return "#" + (0x1000000 + (Math.round((t - R) * p) + R) * 0x10000 + (Math.round((t - G) * p) + G) * 0x100 + (Math.round((t - B) * p) + B)).toString(16).slice(1);
}

function pieSlice(oX, oY, r, pos, len, col,data) {
 this.data = data
 this.originX = oX;
 this.originY = oY;
 this.radius = r;
 this.startingRadian = pos;
 this.length = len;
 this.color = col;
 this.highlightedColor = shadeColor(this.color, .6);
 this.highlighted = false;
 this.popped = false;
 this.animationFrame = 0;

 function setColor(c) {
  this.color = c;
 }
}

pieSlice.prototype.displayData = function(){
 ctx.fillStyle= this.color;
 ctx.fillRect(this.originX - this.radius - 40, this.originY-this.radius-35, 25,25);
 ctx.fillStyle= "white";
 ctx.font = "15px Arial";
 ctx.fillText(this.data, this.originX - this.radius - 10, this.originY - this.radius - 18);
}

pieSlice.prototype.render = function() {
 if (!this.highlighted) {
  ctx.fillStyle = this.color;
  ctx.strokeStyle = this.color;
 } else {
  if(!this.popped && poppable){
   this.displayData();
  }
  // ctx.fillStyle = this.color;
  ctx.fillStyle = this.highlightedColor;
  ctx.strokeStyle = this.color;
 }
 ctx.beginPath();
 var xOffset = Math.cos(this.length / 2 + this.startingRadian) * this.animationFrame;
 var yOffset = Math.sin(this.length / 2 + this.startingRadian) * this.animationFrame;
 ctx.moveTo(this.originX + xOffset, this.originY + yOffset);
 var x = this.originX + xOffset + this.radius * Math.cos(this.startingRadian);
 var y = this.originY + yOffset + this.radius * Math.sin(this.startingRadian);
 ctx.lineTo(x, y);
 ctx.arc(this.originX + xOffset, this.originY + yOffset, this.radius, this.startingRadian, this.startingRadian + this.length);
 if (this.popped) {
  var fill = ctx.fillStyle;
  this.displayData();
  ctx.fillStyle = fill;
  if (this.animationFrame < 30) {
   this.animationFrame += 2;
  }
 } else {
  if (this.animationFrame > 0) {
   this.animationFrame -= 2;
  }
 }
 ctx.closePath();
 //ctx.stroke();
 //if (this.highlighted) {
 ctx.fill();
 // }
}

pieSlice.prototype.update = function() {

}

function pieChart(s) {
 this.slices = s;
}
pieChart.prototype.render = function() {
 this.slices.forEach(function(p) {
  p.render();
 });
};

pieChart.prototype.update = function() {
  this.slices.forEach(function(p) {
   p.update();
  });

 }
 //PIE ONE
var pie = new pieSlice(700, 170, 125, 0, Math.PI / 4, "#FFD1DC", 12);
var slice2 = new pieSlice(700, 170, 125, Math.PI / 4, Math.PI / 4, "#08E8DE");
var slice3 = new pieSlice(700, 170, 125, Math.PI / 2, Math.PI / 4, "#6699CC");
var slice4 = new pieSlice(700, 170, 125, 3 * Math.PI / 4, Math.PI, "#ADD8E6");
var slice5 = new pieSlice(700, 170, 125, 7 * Math.PI / 4, Math.PI / 4, "#B19CD9");
var slices1 = [pie, slice2, slice3, slice4, slice5];

var pink = new pieSlice(220, 170, 125, 0, Math.PI / 3, "#FF4B4B");
var orange = new pieSlice(220, 170, 125, Math.PI / 3, Math.PI / 3, "#FF931B");
var yellow = new pieSlice(220, 170, 125, 2 * Math.PI / 3, Math.PI / 3, "#FFE21B");
var green = new pieSlice(220, 170, 125, 3 * Math.PI / 3, Math.PI / 3, "#90E64E");
var blue = new pieSlice(220, 170, 125, 4 * Math.PI / 3, Math.PI / 3, "#6097D9");
var purple = new pieSlice(220, 170, 125, 5 * Math.PI / 3, Math.PI / 3, "#8365DD");

var redd = new pieSlice(1180, 170, 125, 0, 2 * Math.PI / 3, "#B3989B");
var orangee = new pieSlice(1180, 170, 125, 2 * Math.PI / 3, 1 * Math.PI / 8, "#C1AEE0");
var bluee = new pieSlice(1180, 170, 125, 19 * Math.PI / 24, 4 * Math.PI / 24, "#928CE9");
var greenn = new pieSlice(1180, 170, 125, 23 * Math.PI/24, 3* Math.PI/8, "#676675");
var purplee = new pieSlice(1180, 170, 125, 4 * Math.PI/3, 3* Math.PI/8, "#947D59");
var ceci = new pieSlice(1180, 170, 125, 41 * Math.PI/24, 7*Math.PI/24, "#D994E0");

var slices3 = [redd, orangee, bluee, greenn, purplee, ceci];

var slices2 = [pink, orange, yellow, green, blue, purple];
var pie1 = new pieChart(slices1);
var pie2 = new pieChart(slices2);
var pie3 = new pieChart(slices3);
var update = function() {
 pie1.update();
}
var render = function() {
 ctx.clearRect(0, 0, canvas.width, canvas.height);
 pie1.render();
 pie2.render();
 pie3.render();
}

var step = function() {
 update();
 render();
 animate(step);
}

var animate = window.requestAnimationFrame ||
 window.webkitRequestAnimationFrame ||
 window.mozRequestAnimationFrame ||
 function(callback) {
  window.setTimeout(callback, 1000 / 60);
 };

slices.push.apply(slices, slices1);
slices.push.apply(slices, slices2);
slices.push.apply(slices, slices3);

canvas.addEventListener("mousemove", function(e) {
 var x = e.clientX;
 var y = e.clientY;
 slices.forEach(function(slice) {
  ctx.beginPath();
  var xOffset = Math.cos(slice.length / 2 + slice.startingRadian) * slice.animationFrame;
  var yOffset = Math.sin(slice.length / 2 + slice.startingRadian) * slice.animationFrame;
  ctx.moveTo(slice.originX + xOffset, slice.originY + yOffset);
  var xx = slice.originX + xOffset + slice.radius * Math.cos(slice.startingRadian);
  var yy = slice.originY + yOffset + slice.radius * Math.sin(slice.startingRadian);
  ctx.lineTo(xx, yy);
  ctx.arc(slice.originX + xOffset, slice.originY + yOffset, slice.radius, slice.startingRadian, slice.startingRadian + slice.length);
  if (ctx.isPointInPath(x, y)) {
   slice.highlighted = true;
   slice.displayData();
  } else {
   slice.highlighted = false;
  }
  ctx.closePath();

 });
});

canvas.addEventListener("click", function(e) {
 var x = e.clientX;
 var y = e.clientY;
 slices.forEach(function(slice) {
  ctx.beginPath();
  var xOffset = Math.cos(slice.length / 2 + slice.startingRadian) * slice.animationFrame;
  var yOffset = Math.sin(slice.length / 2 + slice.startingRadian) * slice.animationFrame;
  ctx.moveTo(slice.originX + xOffset, slice.originY + yOffset);
  var xx = slice.originX + xOffset + slice.radius * Math.cos(slice.startingRadian);
  var yy = slice.originY + yOffset + slice.radius * Math.sin(slice.startingRadian);
  ctx.lineTo(xx, yy);
  ctx.arc(slice.originX + xOffset, slice.originY + yOffset, slice.radius, slice.startingRadian, slice.startingRadian + slice.length);
  if (ctx.isPointInPath(x, y)) {
   if (slice.popped) {
    slice.popped = false;
    poppable = true;
   } else {
    if(poppable){
      slice.popped = true;
     poppable = false;
    }
   }
   slice.highlighted = false;
  }
  ctx.closePath();

 });
});

//start the loop
animate(step);

html

<canvas id="mycanvas"></canvas>

以上就是JavaScript 绘制饼图的示例的详细内容,更多关于JavaScript 绘制饼图的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
Javascript的IE和Firefox兼容性汇编
Jul 01 Javascript
js刷新框架子页面的七种方法代码
Nov 20 Javascript
文本框文本自动补全效果示例分享
Jan 19 Javascript
JavaScript常用的返回,自动跳转,刷新,关闭语句汇总
Jan 13 Javascript
JS实现自适应高度表单文本框的方法
Feb 25 Javascript
Jquery使用css方法改变样式实例
May 18 Javascript
简述AngularJS的控制器的使用
Jun 16 Javascript
JS去除空格和换行的正则表达式(推荐)
Jun 14 Javascript
JavaScript类型系统之布尔Boolean类型详解
Jun 26 Javascript
Node.js设置CORS跨域请求中多域名白名单的方法
Mar 28 Javascript
node.js利用mongoose获取mongodb数据的格式化问题详解
Oct 06 Javascript
详解vue页面首次加载缓慢原因及解决方案
Nov 06 Javascript
JavaScript 判断浏览器是否是IE
Feb 19 #Javascript
原生JavaScript实现进度条
Feb 19 #Javascript
原生JavaScript实现换肤
Feb 19 #Javascript
基于vue的video播放器的实现示例
Feb 19 #Vue.js
JavaScript Dom实现轮播图原理和实例
Feb 19 #Javascript
JavaScript使用setTimeout实现倒计时效果
Feb 19 #Javascript
react项目从新建到部署的实现示例
Feb 19 #Javascript
You might like
Yii2下session跨域名共存的解决方案
2017/02/04 PHP
PHP设计模式之模板方法模式定义与用法详解
2018/04/02 PHP
JavaScript Array扩展实现代码
2009/10/14 Javascript
从数据结构的角度分析 for each in 比 for in 快的多
2013/07/07 Javascript
前台js对象在后台转化java对象的问题探讨
2013/12/20 Javascript
JQuery中的html()、text()、val()区别示例介绍
2014/09/01 Javascript
使用变量动态设置js的属性名
2014/10/19 Javascript
JavaScript获取网页、浏览器、屏幕高度和宽度汇总
2014/12/18 Javascript
在JavaScript中使用开平方根的sqrt()方法
2015/06/15 Javascript
jQuery实现的可编辑表格完整实例
2016/06/20 Javascript
详解Nodejs基于mongoose模块的增删改查的操作
2016/12/21 NodeJs
Node.js利用Net模块实现多人命令行聊天室的方法
2016/12/23 Javascript
jquery实现刷新随机变化样式特效(tag标签样式)
2017/02/03 Javascript
简单实现js倒计时功能
2017/02/13 Javascript
Element-ui table中过滤条件变更表格内容的方法
2018/03/02 Javascript
js防抖和节流的深入讲解
2018/12/06 Javascript
小程序自定义导航栏兼容适配所有机型(附完整案例)
2020/04/26 Javascript
vue+animation实现翻页动画
2020/06/29 Javascript
python更新列表的方法
2015/07/28 Python
Python求出0~100以内的所有素数
2018/01/23 Python
python爬虫获取多页天涯帖子
2018/02/23 Python
利用python画出折线图
2018/07/26 Python
Python实现将Excel转换成xml的方法示例
2018/08/25 Python
Python实现繁体中文与简体中文相互转换的方法示例
2018/12/18 Python
Python Sphinx使用实例及问题解决
2020/01/17 Python
python小技巧——将变量保存在本地及读取
2020/11/13 Python
北京某公司的.net笔试题
2014/03/20 面试题
毕业证丢失证明
2014/01/15 职场文书
社团2014年植树节活动总结
2014/03/11 职场文书
大学生活自我评价
2014/04/09 职场文书
2013年最新自荐信范文
2014/06/23 职场文书
中秋客户感谢信
2015/01/22 职场文书
岳麓书院导游词
2015/02/03 职场文书
MySQL数据库超时设置配置的方法实例
2021/10/15 MySQL
你知道Java Spring的两种事务吗
2022/03/16 Java/Android
为什么MySQL不建议使用SELECT *
2022/04/03 MySQL