折线图之后又来饼状图啦~\(≧▽≦)/~啦啦啦

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<canvas id="cv"></canvas>
<script>
var cv=document.getElementById("cv");
cv.style.border = "1px solid red";
cv.width = 600;
cv.height = 400; var ctx = cv.getContext("2d");
// 弧度转化为角度
function toAngle(radian) {
return radian / Math.PI * 180;
} // 角度转化为弧度
function toRadian(angle) {
return angle / 180 * Math.PI;
} //根据数据画饼
var data=[{
"value": .1,
"color": "purple",
"title": "社会招生"
},{
"value": .1,
"color": "rebeccapurple",
"title": "公务员"
},{
"value": .1,
"color": "red",
"title": "公开课"
},{
"value": .1,
"color": "rosybrown",
"title": "前端"
},{
"value": .2,
"color": "royalblue",
"title": "应届生"
},{
"value": .3,
"color": "saddlebrown",
"title": "程序员"
},{
"value": .1,
"color": "salmon",
"title": "老司机"
}];
var startAngle=-90, //饼图起始角度
x0=300, //圆心x的坐标
y0=200, //圆心y的坐标
radius=100, //圆的半径
step= 0, //定义扇形增加角度的变量
line=20; //画线的时候超出半径的一段线长 //画饼
for (var i = 0; i < data.length; i++) {
ctx.beginPath(); //开启新路径
step=data[i].value*360; //根据数据计算增加的角度
var lineAngle=startAngle+step/2; //计算线的角度
ctx.moveTo(x0,y0);
ctx.arc(x0,y0,radius,toRadian(startAngle),toRadian(startAngle+=step));
ctx.fillStyle=data[i].color;
ctx.fill();
ctx.beginPath();
//画线
//圆弧上的点坐标 (x0+r*Math.cos(toRadian(lineAngle/2)),y0+r*Math.sin(toRadian(linAngle/2)))
var x1=x0+(radius+line)*Math.cos(toRadian(lineAngle)),//圆弧上线与圆相交点的x坐标
y1=y0+(radius+line)*Math.sin(toRadian(lineAngle)),//圆弧上线与圆相交点的y坐标
//获取文本长度
textW=ctx.measureText(data[i].title).width,
linePadding=60;
ctx.moveTo(x0,y0);
ctx.lineTo(x1,y1);
ctx.strokeStyle=data[i].color;
ctx.stroke(); ctx.beginPath();
var textPadding=10; //文字与线之间的间距
ctx.moveTo(x1,y1);
//当圆弧x轴坐标大于圆心的x轴坐标,线向右画,linepadding为正值
if(x1>=x0){
ctx.lineTo(x1+linePadding,y1);
//绘制文字 //textpadding同理
ctx.fillText(data[i].title,x1+textPadding,y1-textPadding);
}else{
ctx.lineTo(x1-linePadding,y1);
//使左边的文字右对齐
ctx.textAlign="right";
ctx.fillText(data[i].title,x1-textPadding,y1-textPadding);
}
ctx.strokeStyle=data[i].color;
ctx.stroke();
} </script>
</body>
</html>

显示效果图

[canvas]用canvas绘制饼状图的更多相关文章

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

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

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

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

  3. 用PNChart绘制饼状图简介

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

  4. canvas动态绘制饼状图,

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

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

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

  6. IOS之以UIBezierPath绘制饼状图

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

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

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

  8. d3绘制饼状图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. matplotlib绘制饼状图

    源自http://blog.csdn.net/skyli114/article/details/77508430?ticket=ST-41707-PzNbUDGt6R5KYl3TkWDg-passpo ...

随机推荐

  1. Android之layout_weight解析

    我们先来看以下这段Android布局代码: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/androi ...

  2. SQL 批量删除表

    /*-------------------------------- 功能说明: 批量DropTable 使用说明: 使用时一定要小心,因为删选表的where条件是like所有必须保证where 后的 ...

  3. [Math] 常见的几种最优化方法

    我们每个人都会在我们的生活或者工作中遇到各种各样的最优化问题,比如每个企业和个人都要考虑的一个问题“在一定成本下,如何使利润最大化”等.最优化方法是一种数学方法,它是研究在给定约束之下如何寻求某些因素 ...

  4. MongoDB Windows环境安装及配置

    MongoDB一般安装 1.首先到官网(http://www.mongodb.org/downloads )下载合适的安装包,目前的最新版本为2.6 安装包有zip和msi格式的,这里推荐下载zip格 ...

  5. javascript数据结构-栈

    github博客地址 栈(stack)又名堆栈,它是一种运算受限的线性表.遵循后进先出原则,像垃圾桶似的.功能实现依然按照增删改查来进行,内部数据存储可以借用语言原生支持的数组. 栈类 functio ...

  6. IE 8 下的 box-sizing 和 min-* 属性

    在非 IE 浏览器中,默认情况下 width 属性指的是内容区域(content)的宽度. IE 6+ 中,如果浏览器以标准模型渲染,和非 IE 浏览器的表现是一致的:如果浏览器以怪癖模式渲染,则 w ...

  7. 整理iOS9适配中出现的坑(图文)

    原文: http://www.cnblogs.com/dsxniubility/p/4821184.html 整理iOS9适配中出现的坑(图文)   本文主要是说一些iOS9适配中出现的坑,如果只是要 ...

  8. 项目vue2.0仿外卖APP(一)

    最近用vue.js做一个仿饿了么外卖APP的项目,现在也把流程啊什么的暂时先整理一下在这个博客上面. 当然,这个过程会有点长,不过确实能学到很多东西. 话不多说,马上开始吧. 1.项目介绍 选用当前最 ...

  9. Servlet 之 HttpServlet

    package cn.jiemoxiaodi.http; import java.io.IOException; import javax.servlet.GenericServlet; import ...

  10. 我常用的crontab命令

    命令简介 crontab-操作每个用户的守护程序和该执行的时间表.部分参数说明crontab file [-u user]-用指定的文件替代目前的crontab.crontab-[-u user]-用 ...