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 相关文章推荐
JavaScript框架(iframe)操作总结
Apr 16 Javascript
无限树Jquery插件zTree的常用功能特性总结
Sep 11 Javascript
JavaScript中this详解
Sep 01 Javascript
jQuery基于$.ajax设置移动端click超时处理方法
May 14 Javascript
jQuery移除或禁用html元素点击事件常用方法小结
Feb 10 Javascript
详解vuelidate 对于vueJs2.0的验证解决方案
Mar 09 Javascript
详解Vue 2.0封装axios笔记
Jun 22 Javascript
推荐10款扩展Web表单的JS插件
Dec 25 Javascript
vue无限轮播插件代码实例
May 10 Javascript
使用layui实现树形结构的方法
Sep 20 Javascript
如何在Node和浏览器控制台中打印彩色文字
Jan 09 Javascript
微信小程序实现搜索功能
Mar 10 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
SONY ICF-SW07收音机电路分析
2021/03/02 无线电
如何突破PHP程序员的技术瓶颈分析
2011/07/17 PHP
phpstudy隐藏index.php的方法
2020/09/21 PHP
js跨域和ajax 跨域问题的实现思路
2009/09/05 Javascript
Prototype的Class.create函数解析
2011/09/22 Javascript
idTabs基于JQuery的根据URL参数选择Tab插件
2012/04/11 Javascript
JS 实现列表与多选框选择附预览动画
2014/10/29 Javascript
jQuery 处理页面的事件详解
2015/01/20 Javascript
jquery实现鼠标滑过显示二级下拉菜单效果
2015/08/24 Javascript
关于javascript中dataset的问题小结
2015/11/16 Javascript
Javascript设计模式之观察者模式(推荐)
2016/03/29 Javascript
JavaScript兼容性总结之获取非行间样式案例
2016/08/07 Javascript
jquery滚动条插件(可以自定义)
2016/12/11 Javascript
JavaScript提高加载和执行效率的方法
2017/02/03 Javascript
jQuery元素选择器实例代码
2017/02/06 Javascript
xmlplus组件设计系列之路由(ViewStack)(7)
2017/05/02 Javascript
Angular4学习笔记router的简单使用
2018/03/30 Javascript
基于Vue实现微信小程序的图文编辑器
2018/07/25 Javascript
Vue+Express实现登录注销功能的实例代码
2019/05/05 Javascript
p5.js临摹动态图形实现方法详解
2019/10/23 Javascript
python中numpy的矩阵、多维数组的用法
2018/02/05 Python
python解决js文件utf-8编码乱码问题(推荐)
2018/05/02 Python
Python with语句和过程抽取思想
2019/12/23 Python
基于pytorch中的Sequential用法说明
2020/06/24 Python
python 获取计算机的网卡信息
2021/02/18 Python
HTML高亮关键字的实现代码
2018/10/22 HTML / CSS
Backcountry旗下的户外商品闪购网站:steep&cheap
2016/09/22 全球购物
一夜的工作教学反思
2014/02/08 职场文书
乡镇办公室工作决心书
2014/03/11 职场文书
酒店开业庆典主持词
2014/03/21 职场文书
优秀实习生主要事迹
2014/05/29 职场文书
交通安全标语
2014/06/06 职场文书
人力资源管理毕业求职信
2014/08/05 职场文书
亲属关系公证书样本
2015/01/23 职场文书
Nginx工作原理和优化总结。
2021/04/02 Servers
日本官方排名前10的动漫,名侦探柯南上榜,第一是一部创造历史的动漫
2022/03/18 日漫