HTML5中canvas画图之绘制数据图表

这篇博客介绍了如何使用HTML5的canvas元素绘制数据图表,包括实现的具体效果和关键代码展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇博文绘制了一个方格图,现在来绘制一个数据图表。实现的效果如下:


实现代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>数据图表</title>
</head>
<body>
	<canvas id="canvas" width="300" height="300"></canvas>
	<script type="text/javascript">
		//定义图表数据
		var uriage=[80,92,101,110,68,50,45,90,74,68,98,103];
		drawChart(uriage);
		//绘制折线数据图表的函数
		function drawChart(data){
			//获取上下文
			var canvas=document.getElementById("canvas");
			var ctx=canvas.getContext("2d");
			//描绘背景
			var gradient=ctx.createLinearGradient(0,0,0,300);
			gradient.addColorStop(0,"#e0e0e0");
			gradient.addColorStop(1,"#ffffff");
			ctx.fillStyle=gradient;
			ctx.fillRect(0,0,canvas.width,canvas.height);
			//计算坐标
			var grid_cols=data.length+1;
			var grid_rows=4;
			var cell_width=canvas.width/grid_cols;
			var cell_height=canvas.height/grid_rows;
			//绘制背景的方格线
			ctx.beginPath();
			for(var row=0;row<=grid_rows;row++)
				{
					var y=row*cell_height;
					ctx.moveTo(0,y);
					ctx.lineTo(canvas.width,y);
				}
				for(var col=0;col<grid_cols;col++)
				{
					var x=col*cell_width;
					ctx.moveTo(x,0);
					ctx.lineTo(x,canvas.height);
				}
				ctx.lineWidth=1;ctx.strokeStyle="#c0c0c0";
				ctx.stroke();
				//获取数据中最大值
				var max_v=0;
				for(var i=0;i<data.length;i++)
					{
						if(data[i]>max_v)
							max_v=data[i];
					}
					//为了能让最大值能容纳在图表内,计算坐标
					max_v=max_v*1.1;
					//将数据转换为坐标
					var points=[];
					for(var i=0;i<data.length;i++)
						{
							var v=data[i];
							var px=cell_width*(1+i);
							var py=canvas.height-canvas.height*(v/max_v);
							points.push({"x":px,"y":py});
						}
						//描绘折线
						ctx.beginPath();
						ctx.moveTo(points[0].x,points[0].y);
						for(var i=1;i<points.length;i++)
							{
								ctx.lineTo(points[i].x,points[i].y); 
							}
							ctx.lineWidth=2;
							ctx.strokeStyle="#ee0000";
							ctx.stroke();
							//绘制坐标图形(坐标对于一红色圈圈)
							for(var i in points)
								{
									var p=points[i];
									ctx.beginPath();
									ctx.arc(p.x,p.y,6,0,2*Math.PI);
									ctx.fillStyle="#ee0000";
									ctx.fill(); 
								}
		}
	</script>
</body>
</html>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值