canvas自画图表chart,pieChart

4 篇文章 0 订阅
2 篇文章 0 订阅

先上效果图,后面是html文件+js文件
<img src="https://img-blog.csdn.net/20160414104825165?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" height="376" width="241" alt="" />
 利用canvas自绘图表,可以通过更改js里面的参数发表图表样式
<img src="https://img-blog.csdn.net/20160414104558131?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" height="393" width="248" alt="" />
<!DOCTYPE html>
<html>

	<head>
		<meta charset="UTF-8">
		<!--<link rel="stylesheet" href="css/test.css" />-->
		<title>canvas</title>
	</head>

	<body>
		<p>自画canvas</p>
		<div id="chart"></div>\
		<div id="pieChart"></div>
	</body>
		<script src="js/plugin.js" type="text/javascript" charset="utf-8"></script>
</html>

var plugs=(function(){

		var		config = {
					chartStyle: {
						width: 260,
						height: 200
					},
					origin: {
						x: 5,
						y: 20,
					},
					axisY: {
						marginLeft: 25
					},
					bar: {
						radius: 2.5,
					}
				};

				rateArray = [{
					valueS: 60,
					valueL: 100
				}, {
					valueS: 60,
					valueL: 100
				}, {
					valueS: 60,
					valueL: 100
				}, {
					valueS: 60,
					valueL: 100
				}, {
					valueS: 60,
					valueL: 100
				}, {
					valueS: 60,
					valueL: 100
				}, {
					valueS: 60,
					valueL: 100
				}, {
					valueS: 60,
					valueL: 100
				}, {
					valueS: 60,
					valueL: 100
				}, {
					valueS: 60,
					valueL: 100
				}, {
					valueS: 60,
					valueL: 100
				}, {
					valueS: 60,
					valueL: 100
				}, {
					valueS: 0,
					valueL: 0
				}, {
					valueS: 0,
					valueL: 0
				}, {
					valueS: 0,
					valueL: 0
				}, {
					valueS: 0,
					valueL: 0
				}, {
					valueS: 0,
					valueL: 0
				}, {
					valueS: 60,
					valueL: 100
				}, {
					valueS: 0,
					valueL: 0
				}, {
					valueS: 0,
					valueL: 0
				}, {
					valueS: 0,
					valueL: 0
				}, {
					valueS: 0,
					valueL: 0
				}, {
					valueS: 0,
					valueL: 0
				}, {
					valueS: 0,
					valueL: 0
				}];

				var canvasP = document.getElementById("chart");
				var canvas = document.createElement("canvas");
				canvas.width = 300;
				canvas.height = 250;
				canvasP.appendChild(canvas);
				var cxt = canvas.getContext('2d');

				cxt.beginPath();
				cxt.moveTo(config.axisY.marginLeft, config.origin.y);
				cxt.lineTo(config.axisY.marginLeft, config.chartStyle.height - 3 + config.origin.y);
				cxt.lineTo(config.chartStyle.width + config.axisY.marginLeft, config.chartStyle.height - 3 + config.origin.y);
				cxt.stroke();
				//横坐标
				for (var i = 0; i < 4; i++) {
					cxt.beginPath();
					cxt.moveTo(i * config.chartStyle.width / 3 + config.axisY.marginLeft, config.chartStyle.height - 3 + config.origin.y);
					cxt.lineTo(i * config.chartStyle.width / 3 + config.axisY.marginLeft, config.chartStyle.height + 2 + config.origin.y);
					switch (i) {
						case (0):
							var time = '00:00';
							break;
						case (1):
							var time = '08:00';
							break;
						case (2):
							var time = '16:00';
							break;
						case (3):
							var time = '24:00';
							break;
					}
					cxt.font = '12px Arial';
					cxt.globalAlpha = 0.5;
					cxt.fillText(time, i * config.chartStyle.width / 3 + config.origin.x, config.chartStyle.height + 15 + config.origin.y);
					cxt.stroke();
				}

				//				纵坐标
				for (var i = 0; i < 6; i++) {
					cxt.beginPath();
					cxt.font = '12px Arial';
					cxt.globalAlpha = 0.5;
					cxt.fillText(30 + 20 * i, 0, (config.chartStyle.height - 3) * (5 - i) / 5 + config.origin.y);
					cxt.stroke();
				}

				//			画柱状图
				for (var i = 0; i < 24; i++) {
					//					柱子
					var jjj = i + 1;
					cxt.fillStyle = "#EFEFEF";
					cxt.globalAlpha = 1;
					cxt.fillRect(jjj * config.chartStyle.width / 24 + config.axisY.marginLeft - config.bar.radius, config.chartStyle.height - 3 - (rateArray[i].valueL - 30) * 1.97 - config.bar.radius + config.origin.y, 2 * config.bar.radius, (rateArray[i].valueL - rateArray[i].valueS) * 1.97);

					//					柱子上圆
					if (rateArray[i].valueL == 0) {
						cxt.globalAlpha = 0;
						cxt.fillStyle = "#FFFFFF";
					} else {
						cxt.fillStyle = "#FD3869";
					}
					cxt.beginPath();
					var j = i + 1;
					cxt.arc(j * config.chartStyle.width / 24 + config.axisY.marginLeft, config.chartStyle.height - 3 - (rateArray[i].valueL - 30) * 1.97 - config.bar.radius + config.origin.y, config.bar.radius, 0, Math.PI * 2, true);
					cxt.closePath();
					cxt.fill();

					//					柱子下圆
					if (rateArray[i].valueL == 0) {
						cxt.globalAlpha = 0;
						cxt.fillStyle = "#FFFFFF";
					} else {
						cxt.fillStyle = "#FDD00A";
					}
					cxt.beginPath();
					var jj = i + 1;
					cxt.arc(jj * config.chartStyle.width / 24 + config.axisY.marginLeft, config.chartStyle.height - 3 - rateArray[i].valueS - config.bar.radius + config.origin.y, config.bar.radius, 0, Math.PI * 2, true);
					cxt.closePath();
					cxt.fill();

				}
				
				

				var canvasP = document.getElementById("pieChart");
				var canvas = document.createElement("canvas");
				canvas.width = 320;
				canvas.height = 150;
				canvasP.appendChild(canvas);
				var cxt = canvas.getContext('2d');

				var data_arr = [0.15, 0.25, 0.6];
				var color_arr = ["#84d0e8", "#3399ff", "#007aff"];
				var text_arr = ["心率正常:60-100bmp", "心率过缓:<60bpm", "心率过速心动过速:>100bmp"];

				var pi2 = Math.PI * 2;
				var c = canvas.getContext("2d");
				c.font = "12px Times New Roman";
				var startAgl = 0;
				var agl;
				for (var i = 0; i < data_arr.length; i++) {
					//绘制饼图
					c.setanti
					agl = data_arr[i] * pi2 + startAgl;
					c.fillStyle = color_arr[i];
					c.beginPath();
					c.lineWidth = 1;
					c.moveTo(80.5, 80.5);
					c.arc(80.5, 80.5, 50, startAgl, agl, false);
					c.lineTo(80.5, 80.5);
					c.fill();
					startAgl = agl;
					//绘制图例
					c.lineWidth = 1;
					c.fillRect(160, 50 + 18 * i, 16, 16);
					c.fillStyle = "#000000";
					c.fillText(text_arr[i], 180.5, 62.5 + 18 * i);
				}

})();



注意事项:在重新绘图的时候一定要关闭之前的路径closePath(),否则新的路径可能会覆盖之前的

注:下一篇canvas模糊问题优化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值