JavaScript canvas绘制折线图


Posted in Javascript onFebruary 18, 2020

本文实例为大家分享了canvas绘制折线图的具体代码,供大家参考,具体内容如下

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
 <style>
 canvas {
 border: 1px solid #ccc;
 }
 </style>
</head>
<body>
<canvas width="600" height="400"></canvas>
<script>
 /*1.构造函数*/
 var LineChart = function (ctx) {
 /*获取绘图工具*/
 this.ctx = ctx || document.querySelector('canvas').getContext('2d');
 /*画布的大小*/
 this.canvasWidth = this.ctx.canvas.width;
 this.canvasHeight = this.ctx.canvas.height;
 /*网格的大小*/
 this.gridSize = 10;
 /*坐标系的间距*/
 this.space = 20;
 /*坐标原点*/
 this.x0 = this.space;
 this.y0 = this.canvasHeight - this.space;
 /*箭头的大小*/
 this.arrowSize = 10;
 /*绘制点*/
 this.dottedSize = 6;
 /*点的坐标 和数据有关系 数据可视化*/
 }
 /*2.行为方法*/
 LineChart.prototype.init = function (data) {
 this.drawGrid();
 this.drawAxis();
 this.drawDotted(data);
 };
 /*绘制网格*/
 LineChart.prototype.drawGrid = function () {
 /*x方向的线*/
 var xLineTotal = Math.floor(this.canvasHeight / this.gridSize);
 this.ctx.strokeStyle = '#eee';
 for (var i = 0; i <= xLineTotal; i++) {
 this.ctx.beginPath();
 this.ctx.moveTo(0, i * this.gridSize - 0.5);
 this.ctx.lineTo(this.canvasWidth, i * this.gridSize - 0.5);
 this.ctx.stroke();
 }
 /*y方向的线*/
 var yLineTotal = Math.floor(this.canvasWidth / this.gridSize);
 for (var i = 0; i <= yLineTotal; i++) {
 this.ctx.beginPath();
 this.ctx.moveTo(i * this.gridSize - 0.5, 0);
 this.ctx.lineTo(i * this.gridSize - 0.5, this.canvasHeight);
 this.ctx.stroke();
 }
 };
 /*绘制坐标系*/
 LineChart.prototype.drawAxis = function () {
 /*X轴*/
 this.ctx.beginPath();
 this.ctx.strokeStyle = '#000';
 this.ctx.moveTo(this.x0, this.y0);
 this.ctx.lineTo(this.canvasWidth - this.space, this.y0);
 this.ctx.lineTo(this.canvasWidth - this.space - this.arrowSize, this.y0 + this.arrowSize / 2);
 this.ctx.lineTo(this.canvasWidth - this.space - this.arrowSize, this.y0 - this.arrowSize / 2);
 this.ctx.lineTo(this.canvasWidth - this.space, this.y0);
 this.ctx.stroke();
 this.ctx.fill();
 /*Y轴*/
 this.ctx.beginPath();
 this.ctx.strokeStyle = '#000';
 this.ctx.moveTo(this.x0, this.y0);
 this.ctx.lineTo(this.space, this.space);
 this.ctx.lineTo(this.space + this.arrowSize / 2, this.space + this.arrowSize);
 this.ctx.lineTo(this.space - this.arrowSize / 2, this.space + this.arrowSize);
 this.ctx.lineTo(this.space, this.space);
 this.ctx.stroke();
 this.ctx.fill();
 };
 /*绘制所有点*/
 LineChart.prototype.drawDotted = function (data) {
 /*1.数据的坐标 需要转换 canvas坐标*/
 /*2.再进行点的绘制*/
 /*3.把线连起来*/
 var that = this;
 /*记录当前坐标*/
 var prevCanvasX = 0;
 var prevCanvasY = 0;
 data.forEach(function (item, i) {
 /* x = 原点的坐标 + 数据的坐标 */
 /* y = 原点的坐标 - 数据的坐标 */
 var canvasX = that.x0 + item.x;
 var canvasY = that.y0 - item.y;
 /*绘制点*/
 that.ctx.beginPath();
 that.ctx.moveTo(canvasX - that.dottedSize / 2, canvasY - that.dottedSize / 2);
 that.ctx.lineTo(canvasX + that.dottedSize / 2, canvasY - that.dottedSize / 2);
 that.ctx.lineTo(canvasX + that.dottedSize / 2, canvasY + that.dottedSize / 2);
 that.ctx.lineTo(canvasX - that.dottedSize / 2, canvasY + that.dottedSize / 2);
 that.ctx.closePath();
 that.ctx.fill();
 /*点的连线*/
 /*当时第一个点的时候 起点是 x0 y0*/
 /*当时不是第一个点的时候 起点是 上一个点*/
 if(i == 0){
 that.ctx.beginPath();
 that.ctx.moveTo(that.x0,that.y0);
 that.ctx.lineTo(canvasX,canvasY);
 that.ctx.stroke();
 }else{
 /*上一个点*/
 that.ctx.beginPath();
 that.ctx.moveTo(prevCanvasX,prevCanvasY);
 that.ctx.lineTo(canvasX,canvasY);
 that.ctx.stroke();
 }
 /*记录当前的坐标,下一次要用*/
 prevCanvasX = canvasX;
 prevCanvasY = canvasY;
 });
 };
 /*3.初始化*/
 var data = [
 {
 x: 100,
 y: 120
 },
 {
 x: 200,
 y: 160
 },
 {
 x: 300,
 y: 240
 },
 {
 x: 400,
 y: 120
 },
 {
 x: 500,
 y: 80
 }
 ];
 var lineChart = new LineChart();
 lineChart.init(data);
</script>
</body>
</html>

运行结果如下:

JavaScript canvas绘制折线图

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Backbone.js中的集合详解
Jan 14 Javascript
jQuery中delegate()方法用法实例
Jan 19 Javascript
jQuery简单实现验证邮箱格式
Jul 15 Javascript
jquery+php随机生成红包金额数量代码分享
Aug 27 Javascript
jQuery进行组件开发完整实例
Dec 15 Javascript
js中获取时间new Date()的全面介绍
Jun 20 Javascript
高效Web开发的10个jQuery代码片段
Jul 22 Javascript
原生js实现简单的Ripple按钮实例代码
Mar 24 Javascript
微信小程序 slider的简单实例
Apr 19 Javascript
浅谈Vue路由快照实现思路及其问题
Jun 07 Javascript
微信小程序实现星星评价效果
Nov 02 Javascript
node.js 使用 net 模块模拟 websocket 握手进行数据传递操作示例
Feb 11 Javascript
node+multer实现图片上传的示例代码
Feb 18 #Javascript
JavaScript canvas绘制圆弧与圆形
Feb 18 #Javascript
javascript中的with语句学习笔记及用法
Feb 17 #Javascript
JS实现百度搜索框关键字推荐
Feb 17 #Javascript
js实现百度淘宝搜索功能
Feb 17 #Javascript
JavaScript使用canvas绘制随机验证码
Feb 17 #Javascript
JavaScript中this的学习笔记及用法整理
Feb 17 #Javascript
You might like
PHP 数组遍历顺序理解
2009/09/09 PHP
php 文章调用类代码
2011/08/11 PHP
ThinkPHP验证码使用简明教程
2014/03/05 PHP
php二分查找二种实现示例
2014/03/12 PHP
ThinkPHP数据操作方法总结
2015/09/28 PHP
php设计模式之代理模式分析【星际争霸游戏案例】
2020/03/23 PHP
js Form.elements[i]的使用实例
2011/11/13 Javascript
js鼠标滑过弹出层的定位IE6bug解决办法
2012/12/26 Javascript
javascript实现的平方米、亩、公顷单位换算小程序
2014/08/11 Javascript
php利用curl获取远程图片实现方法
2015/10/26 Javascript
基于JavaScript实现鼠标悬浮弹出跟随鼠标移动的带箭头的信息层
2016/01/18 Javascript
vue.js的提示组件
2017/03/02 Javascript
利用javascript如何随机生成一定位数的密码
2017/09/22 Javascript
js实现单张图片平移切换效果
2017/10/11 Javascript
JQuery元素快速查找与操作
2018/04/22 jQuery
微信小程序之几种常见的弹框提示信息实现详解
2019/07/11 Javascript
JavaScript 判断数据类型的4种方法
2020/09/11 Javascript
Python中装饰器兼容加括号和不加括号的写法详解
2017/07/05 Python
Python正则捕获操作示例
2017/08/19 Python
python读取excel指定列数据并写入到新的excel方法
2018/07/10 Python
python中将\\uxxxx转换为Unicode字符串的方法
2018/09/06 Python
自学python的建议和周期预算
2019/01/30 Python
Python OpenCV 调用摄像头并截图保存功能的实现代码
2019/07/02 Python
python找出因数与质因数的方法
2019/07/25 Python
Django DRF APIView源码运行流程详解
2020/08/17 Python
支票、地址标签、包装纸和慰问卡:Current Catalog
2018/01/30 全球购物
香港中原电器网上商店:Chung Yuen
2019/06/26 全球购物
益模软件Java笔试题
2012/03/27 面试题
Shell脚本如何向终端输出信息
2014/04/25 面试题
绩效工资实施方案
2014/03/15 职场文书
2014年四风个人对照检查及整改措施
2014/10/28 职场文书
英文邀请函
2015/02/02 职场文书
工资证明格式模板
2015/06/12 职场文书
小学数学教学随笔
2015/08/14 职场文书
导游词之南京栖霞山
2019/10/18 职场文书
Pytest中skip skipif跳过用例详解
2021/06/30 Python