JavaScript怎样绘制饼图?
Admin 2021-05-18 群英技术资讯 1074 次浏览
饼图在做统计的时候是比较常见,能够形象的展示每个部分所占比例,那么用代码要怎么实现呢?下面小编就给大家分享关于使用JS实现饼图绘制效果的代码,下图是实现效果,感兴趣的朋友可以参考。

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);
<canvas id="mycanvas"></canvas>
关于JavaScript绘制饼图的介绍就到这,上述代码具有一定的借鉴价值,有需要的朋友可以参考,希望对大家学习和了解JS实现饼图有帮助,更多JS绘图效果可以关注其他相关文章。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要为大家详细介绍了vue实现伸缩菜单功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
JS如何在tml文档增删改查元素节点,有不少朋友对此感兴趣,下面小编给大家整理和分享了相关知识和资料,易于大家学习和理解,有需要的朋友可以借鉴参考,下面我们一起来了解一下吧。
本文主要实现给项目的整个背景加上自定义水印,可以改变水印的文案和字体颜色等,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
我们通常会用到脚手架vuecli创建项目,此时需要安装脚手架,下面这篇文章主要给大家介绍了关于vue脚手架安装以及安装失败问题的解决办法,需要的朋友可以参考下
今天给大家分享一道JavaScript的面试题,这道问题可是难道不少人呢。JS中我们经常会使用foreach这个方法来遍历数组,那么forEach能否跳出循环?如果能,forEach如何跳出循环?下面我们一起来探讨一下。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008