<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<canvas id="c"></canvas>
<script>
var cv = document.getElementById("c");
var ctx = cv.getContext("2d"); cv.width = 600;
cv.height = 400;
cv.style.border = "1px solid #000"; // 角度转弧度方法
function toRadian(angle) {
return angle / 180 * Math.PI;
} function toAngle(radain) {
return radian / Math.PI * 180;
} // 数据中的value值的和 为: 1
/*var data = [{
"value": .1,
"color": "orange",
"title": "社会招生"
},{
"value": .1,
"color": "pink",
"title": "公务员"
},{
"value": .1,
"color": "gray",
"title": "公开课"
},{
"value": .1,
"color": "#909090",
"title": "前端"
},{
"value": .2,
"color": "red",
"title": "应届生"
},{
"value": .3,
"color": "blue",
"title": "程序员"
},{
"value": .1,
"color": "#abc",
"title": "老司机"
}];*/
var data = [{
"value": .9,
"color": "orange",
"title": "社会招生"
},{
"value": .1,
"color": "pink",
"title": "公务员"
}]; var startAngle = -90, // 起始角度
x0 = cv.width / 2, y0 = cv.height / 2, // 圆心点坐标
radius = 100, // 半径
curAngle = 0, // 结束角度
textX = 0, textY = 0, // 文字的坐标
textOffset = 20, // 文字到饼型图的距离
textWidth = 0, // 文字的宽度
text2Line = 0; // 文字的起始位置到结束位置的长度 data.forEach(function(value, index) {
ctx.beginPath(); // 1 先绘制饼型图
curAngle = value.value * 360;
ctx.fillStyle = value.color;
ctx.moveTo(x0, y0);
ctx.arc(x0, y0, radius, toRadian(startAngle), toRadian( startAngle+curAngle));
ctx.fill(); // 2 绘制指向文字的线, 不要忘了将角度转化为弧度!!!
textX = x0 + (radius + textOffset) * Math.cos( toRadian(startAngle + curAngle / 2) );
textY = y0 + (radius + textOffset) * Math.sin( toRadian(startAngle + curAngle / 2) );
ctx.strokeStyle = value.color;
ctx.moveTo(x0, y0);
ctx.lineTo(textX, textY);
ctx.stroke(); // 3 绘制文字 和 文字的底线
// 获取文字的宽度
textWidth = ctx.measureText(value.title).width;
if(textX <= x0) {
// 设置文字的对齐方式 右对齐
ctx.textAlign = "right"; textOffset = -textOffset;
textWidth = -textWidth;
}
// 3.1 绘制文字
ctx.fillText(value.title, textX + textOffset, textY - 10); // 3.2 绘制文字的底线
// 文字底线的长度 = 文字的x坐标 + 文字到线的偏移 + 文字的宽度
text2Line = textX + textOffset + textWidth;
ctx.moveTo(textX, textY);
ctx.lineTo(text2Line, textY);
ctx.stroke(); // 赋值
startAngle += curAngle;
// 每次执行完,需要重新初始化偏移值
// (因为上一次有可能改变了偏移值的符号)
textOffset = 20;
});
</script>
</body>
</html>

canvas绘制饼型图的更多相关文章

  1. 第166天:canvas绘制饼状图动画

    canvas绘制饼状图动画 1.HTML <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  2. [canvas]用canvas绘制饼状图

    折线图之后又来饼状图啦~\(≧▽≦)/~啦啦啦 <!DOCTYPE html> <html lang="en"> <head> <meta ...

  3. 使用canvas绘制饼状图

    <!doctype html><html lang="en"><head> <meta charset="UTF-8" ...

  4. Canvas(3)---绘制饼状图

    Canvas(3)---绘制饼状图 有关canvas之前有写过两篇文章 1.Canvas(1)---概述+简单示例 2.Canvas(2)---绘制折线图 在绘制饼状图之前,我们先要理解什么是圆弧,如 ...

  5. 用PNChart绘制饼状图简介

    写在前面 最近做的小Demo中有一个绘制饼状图的需求.在开始实现之前上网了解了一下现有的一些绘制图形的第三方库,相应的库还是有挺多的,PNChart便是其中一个.PNChart是一个90后的中国boy ...

  6. canvas动态绘制饼状图,

    当我们使用Echrts很Highcharts的时候,总是觉得各种统计图表是多么神奇,今天我就用现代浏览器支持的canvas来绘制饼状统计图,当然仅仅是画出图并没什么难度,但是统计图一般都有输入,根据不 ...

  7. Graphic系统综合练习案例-绘制饼状图

    这里用一个案例来将之前学过的关于绘制相关的东东加强巩固一下,纯绘制,木有加点击效果,先来看下最终效果: github中这种百分比饼图的效果非常非常之多,实际在项目中开发当产品有这样类似的需求时做为开发 ...

  8. IOS之以UIBezierPath绘制饼状图

    1.绘制的饼状图是通过多个扇形拼和而成,绘制一个扇形也是比较简单的,核心代码如下: 先画一条圆弧,再画半径,接着再画一条圆弧,最后闭合路径: UIBezierPath*  aPath = [[UIBe ...

  9. [Echarts]用Echarts绘制饼状图

    在项目网站的网页中,有这样一幅图: 心血来潮,想使用百度Echarts来绘制一下,可是没能绘制得完全一样,Echarts饼状图的label不能在图形下面放成一行,最后的效果是这样子的: 鼠标移动到it ...

随机推荐

  1. C# 4.0新加特性

    协变和逆变 这个在C#2.0中就已经支持委托的协变和逆变了,C#4.0开始支持针对泛型接口的协变和逆变: IList<string> strings = new List<strin ...

  2. jQuery添加新的元素

    append() - 在被选元素的结尾插入内容 prepend() - 在被选元素的开头插入内容 after() - 在被选元素之后插入内容 before() - 在被选元素之前插入内容 $(&quo ...

  3. vc++如何创建程序-函数的重载

    重载构成的条件:函数的参数类型,参数个数不同,才能构成函数的重载 函数重载分为两种情况: 1 .(1)void output(); (2)int output(); 2 .(1)void output ...

  4. 安装Mysql的一些问题,比如Net Connect 卸载不掉,注册表相关操作

    我安装mysql用了一段时间后卸载了,在安装就发现安装不了了,原因就是卸载的时候Net Connetc无法卸载,我试了一个月也没有解决后来百度各种还是没有办法解决.于是就尝试自己手动卸载注册表.在“开 ...

  5. 【JavaScript框架封装】实现一个类似于JQuery的CSS样式框架的封装

    // CSS 样式框架 (function (xframe) { // 需要参与链式访问的(必须使用prototype的方式来给对象扩充方法)[只要是需要使用到this获取到的元素集合这个变量的时候, ...

  6. Project Euler 27 Quadratic primes( 米勒测试 + 推导性质 )

    题意: 欧拉发现了这个著名的二次多项式: f(n) = n2 + n + 41 对于连续的整数n从0到39,这个二次多项式生成了40个素数.然而,当n = 40时402 + 40 + 41 = 40( ...

  7. react 简单在页面中输出一段文字

    之前用脚手架创建了一个react项目,将react自带的src文件夹删除后创建一个空的src文件夹 在src文件夹中创建一个index.jsx文件作为JS入口文件并创建一个hello组件 现在我们进入 ...

  8. java自带线程池和队列详细讲解,android中适用

    Java线程池使用说明 一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的.在jdk1.5之后这一情况有了很大的改观.Jdk1.5之后 ...

  9. js实现本地的图片压缩上传预览

    js在设计时考虑到安全的原因是不允许读写本地文件的,随着html5的出现提供了fileReader AP从而可以I实现本地图片的读取预览功能, 另外在移动端有的限制图片大小的需求,主要是考虑图片过大会 ...

  10. Java基础学习总结(62)——Java中的流和Socket

    按行读入方式: BufferedReader(); 1.以行为读取单位,读取比较方便. 按行读一般都是字符读. BufferedReader和PrintWriter的内存分析图: 数据流: 输入 输出 ...