canvas js 绘图插件_Canvas专题—绘制柱状图(2)

28b6c633975f4d52e6fc2ddd9d767e42.png

目标:在我们了解过前两章节的知识点以后,为了把知识点进行连结,拓展,现在我们做一个图表吧。

b305e1ed5e9b1e2715ca04476ed5dcf7.png

看一个echartst图表

当今Canvas库有很多供我们选择,比如,echarts在很大程度上能够提高我们的工作效率,但是也存在着一些问题:

  • 从业务覆盖度出发,echarts库能提供很多模板,但是我们只需要其中的一种或者几种就够了,显然造成了资源的浪费;
  • 如果业务需求变更,改进,那么依靠图表库,肯定是不能满足业务的,失去了灵活性。

这就是我们用Canvas打造自己图表的原因。

分析图表

让我们先看一下目标图表的外观

3d0c0ae28d72a9a4346cb1744d8799e4.png

如图所示,此图表由坐标轴X,Y,描述数字,文字,填充矩形,辅助线构成。另外我们按比例计算坐标,增强复用性。

准备工作

让我们先在一个文件夹内建立2个文件夹,一个chart.html文件.:css文件夹,存放样式;js文件夹,存放js代码;html文件是程序入口文件,然后在chart.html文件中引入css,js文件夹中的对应文件。

1ce0ec7f647553bf4953f76cde64e94a.png

我们在chart.html中写一个div标签来作为存放Canvas的容器。

<!DOCTYPE html>

js文件准备

'use strict'

从chart.js文件开始

现在让我们用面向对象的方式将它用Canvas画出来。用面向对象的好处就是页面有多个图表的时候我们调用函数,传入所需的参数,放到容器通常div中即可。

模拟来自后台的数据

var 

这里我们在chart.js文件中写入了data数组,是模拟后台传给我们的数据,画图基于此。其中用到了getRandomInt函数:

/* 

接着我们再定义一下所需要的变量

var 

定义所必需的变量

现在我们有了全局变量data,targetId,cw,ch。这些是我们准备画Canvas的必要参数。

图表功能函数

我们现在准备一个Bcharts构造函数:

function 

this在函数内,指向调用函数的对象。configureChart,配置图表函数,init初始化函数包含了:

  • createCanvas函数创建Canvas元素,并插入到div中,通过getContext('2d')得到绘图上下文;
  • handleData函数获取来自后台的数据x,y轴上的数据;
  • prepareData函数对数据进行处理,按比例计算,分配x,y轴坐标的位置。;
  • draw函数绘制图表所有元素;

创建Canvas元素

通过createCanvas函数创建Canvas。

Bcharts

设置Canvas参数

通过setCanvasParameters对Canvas必需的参数赋值到chart属性。

Bcharts

设置图表比例

通过setChartParameters函数配置:x,y,文字,展示的比例。比例10,6可以根据ui需要自行更改。

Bcharts

配置图表

通过configureChart函数整合画布,图表比例的配置。

Bcharts

初始化

定义init函数到Bcharts原型上,内部调用如下方法:

Bcharts

提取模拟数据

其实我们在拿到后台的数据后,需要提取我们所需要的数据,比如label,value,具体还要根据后端提供的数据进行提取,整理

Bcharts

整理数据

用prepareData函数整理我们的数据,需要了解

Math.max.apply(null,[arg1,arg2,arg3]);

两个参数:

  • null参数不改变this指向;
  • [arg1,arg2,arg3]应用Math.max方法的对象,在prepareData函数内我们chart.values为数组,故求出最大值
Bcharts

画函数

在这里让我们将draw函数进行细化,正如我们在开头分析图表中分析图表构成的元素。

细化后的函数职责单一,方便调试,更改,更加清晰。如下所示:

Bcharts

1.画x轴

通过drawX函数画x轴:

Bcharts

其中坐标依赖我们setChartParameters函数设置的比例,也就是说图表坐标0就是moveTo(60,405),画笔开始的点

afa8e310f684b3a603314fa6729c9529.png

lineTo(540,405),x轴上,y轴值肯定是不变的,所以画布宽度-比例的留白就是图表x轴的终点。接下来我们给定线宽,stroke(),就好了。

2.画y轴

通过drawY函数画y轴:

Bcharts

3.画x轴描述文字

通过drawXLabel函数画出x轴描述文字(一,二,三月...):

Bcharts

4.画y轴数值

通过drawYLabel函数画y轴,如上同理:

Bcharts

5.画水平辅助线

通过HorGuideLines函数画x轴辅助线:

Bcharts

f16be061b08a498fa06f8dc181611e97.png

6.画垂直辅助线

通过verGuideLines画垂直辅助线同理:

Bcharts

7.准备填充矩形随机填充色

Bcharts

8.画矩形

通过drawBars绘制矩形

Bcharts

9.调用Bcharts

var 

new在此时做了两件事情:

  • 创建了一个新的Bcharts对象;
  • 返回了一个新的Bcharts对象。

我们将返回的新的Bcharts通过var引用到chart。

打印chart我们将得到:

181089802e1ed590ba022d8bc728f40a.png

所以chart共享Bcharts所有属性,方法。

思考行动

我们从分析图表的构成:

  • x轴;
  • y轴;
  • 辅助线;
  • 矩形。

然后还有看不见的数据处理与准备,最重要的我们根据比例多次依赖setChartParameters函数,一步一步将图表完成。

比较难些的有两个地方:

  • 整理数据;
  • setChartParameters函数对于图表比例的设计。

希望大家能够对setChartParameters函数进行比例的改变,通过自己绘画,加强自己对绘制柱状图业务模型的了解。

在下一章节中我们开始绘制动态屏保,不例外也用到本章与之前的知识点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/556391.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

界面优美的linux,Ubuntu 11.04新版发布 诠释精美用户界面

主要改进内容如下&#xff1a;Unity界面在Alpha 3中进行了重大改进&#xff0c;重新设计了Dash面板的功能&#xff0c;可以按类别显示应用程序&#xff0c;此外还包括更好的搜索过滤、支持全屏以及其他视觉效果的提升。Ubuntu 11.04 Alpha 3升级了安装程序&#xff0c;用户如今…

springboot 使用 minio

springboot 使用 minio yml 配置 yml 配置 # ↓↓↓↓↓↓ MinIO文件服务器 ↓↓↓↓↓↓ minio:url: http://114.67.110.190:9001accessKey: minioadminsecretKey: minioadminbucketName: zpfmaven: <dependency><groupId>io.minio</groupId><artifa…

立创EDA

绘制PCB流程&#xff1a; 画原理图 ——> 画原理图 ——> 布线 ——> 铺铜 器件&#xff1a; 器件就是一个个不同的元件&#xff0c;每个元件不同的引脚有不同的功能&#xff0c;但有可能封装是一样的&#xff0c;所以将器件和封装练习起来&#xff0c;才能将…

python中sorted函数的用法_Python3 中sorted() 函数的用法

描述 sorted() 函数对所有可迭代的对象进行排序操作。 语法 sorted(iterable, keyNone, reverseFalse) iterable – 可迭代对象。 key – 主要是用来进行比较的元素&#xff0c;只有一个参数&#xff0c;具体的函数的参数就是取自于可迭代对象中&#xff0c;指定可迭代对象中的…

springboot整合minio最新版

第一步&#xff1a;查找minio最新依赖&#xff0c;通过maven查询网站查询,这搜索框输入minio&#xff0c; 也可以查看MinIO官网https://docs.min.io/docs/java-client-quickstart-guide.html 如下: 点击minio进入查看maven依赖&#xff0c;可以看到最新版为8.3.4 <dependen…

学生学籍管理系统python_使用Python实现 学生学籍管理系统

大家好&#xff0c;今天跟大家分享一个用Python实现的学生学籍管理系统&#xff1a; 该代码主体由五个函数组成&#xff1a; 1.add_stu() 添加 2.del_stu() 删除 3.print_stu()打印 4.exit_stu() 退出 5.system() 主函数 1.add_stu() 此段函数作用&#xff1a;把输入的值存入字…

Okhttp使用详解

在Android开发中&#xff0c;发送HTTP请求是很常见的。SDK中自带的HttpURLConnection虽然能基本满足需求&#xff0c;但是在使用上有诸多不便&#xff0c;为此&#xff0c;square公司实现了一个HTTP客户端的类库——Okhttp 。 Okhttp是一个支持HTTP 和 HTTP/2 的客户端&#x…

如何开发rest接口服务_如何简化网络请求接口开发

日常开发中&#xff0c;需要大量和后端对接接口&#xff0c;很容易写出大量的模板代码&#xff0c;比如把对接口的请求放到组件内&#xff0c;或者虽然有数据访问层&#xff0c;但是有大量 get&#xff0c;post 方法的调用&#xff0c;传参的字符串拼接&#xff0c;异常处理等等…

质量属性效用树例子_数百个 HTML5 例子学习 HT 图形组件 – 拓扑图篇

HT 是啥&#xff1a;Everything you need to create cutting-edge 2D and 3D visualization.这口号是当年心目中的产品方向&#xff0c;接着就朝这个方向慢慢打磨&#xff0c;如今 HT 算是达到了这样的效果&#xff0c;谈不上用尽洪荒之力&#xff0c;但我们对产品结果很满意&a…

linux vi 出现下划线,Vim高亮当前行(显示为下划线)的解决方案

最近配置Vim&#xff0c;由于以前的vimrc早已丢失&#xff0c;只好重新配置一份&#xff0c;此为题外话&#xff0c;略过不提…在Vim中&#xff0c;可以选择开启高亮当前行&#xff0c;这是一个很不错的特性。开启它也很简单&#xff0c;只需要在vimrc中加入这么一行&#xff1…

springBoot 简单优雅是实现文件上传和下载

前言 好久没有更新spring Boot 这个项目了。最近看了一下docker 的知识&#xff0c;后期打算将spring boot 和docker 结合起来。刚好最近有一个上传文件的工作呢&#xff0c;刚好就想起这个脚手架&#xff0c;将文件上传和下载整理进来。 配置 在application.properties 中增…

C语言的VC开发环境界面介绍,【c语言在vc++6.0中编写界面程序】

到现在为止&#xff0c;C 仍然是计算机编程领域的经典语言之一&#xff0c;C 17 标准在2017上半年已经探讨确定。本期我们汇集了编程专家——祁宇(《深入应用 C 11》作者&#xff0c;C 开源社区 purecpp.org 创始人)的多年心得小结&#xff0c;并具体介绍了 C 17 最新标准中值得…

SpringBoot+VUE 前端加密算法 RSA+DES

前言 为了提高用户登陆的安全性&#xff0c;公司准备整理一份相对安全的登陆模式。 想法 主流加密算法 主流加密算法 &#xff08;一&#xff09;对称加密AES ,其特点是&#xff1a;算法简单&#xff0c;加密速度快&#xff1b; &#xff08;二&#xff09;非对称加密方式&…

spring cloud微服务_年后进大厂,必备这份微服务面试题:Dubbo+SpringBoot+Cloud

Dubbo面试题Dubbo与DubboX区别Dubbo中zookeeper做注册中心&#xff0c;如果注册中心集群都挂掉&#xff0c;发布者和订阅者之间还能通信么&#xff1f;Dubbo中有哪些角色&#xff1f;Dubbo在安全机制方面是如何解决的Dubbo执行流程&#xff1f;Dubbo支持的协议有哪些&#xff1…

全栈工程师薪水_2020 Java 全栈工程师进阶路线图,不可错过

技术更新日新月异&#xff0c;对于初入职场或者刚开始学习的同学来说&#xff0c;经常会困惑该往那个方向发展&#xff0c;这一点所有刚开始学习的人基本都有这个体会的。刚开始学习 Java 那会&#xff0c;最大的问题就是不知道该学什么&#xff0c;以及学习的顺序&#xff0c;…

cookie、Session、Token、sessionStorage、localStorage简介__Token放在 cookie, sessionStorage 和 localStorage中区别

cookie、Session、Token、sessionStorage、localStorage简介 cookie 是一个非常具体的东西&#xff0c;只得是浏览器里永久存储的一种数据&#xff0c;是浏览器实现的一种数据存储功能。Cookie在计算机中是个存储在浏览器目录中的文本文件&#xff0c;当浏览器运行时&#xf…

c语言树莓派音乐播放器,使用web端来控制我的树莓派播放音乐

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;web端控制树莓派播放音乐&#xff0c;PHPNodeJSmpg123&#xff0c;粗糙版。实现后还可以做个app什么的。代码git用到的代码内容可以在这里看~nodempg.js启动一个se…

Nginx学习_狂神

Nginx 公司产品出现瓶颈&#xff1f; 我们公司项目刚刚上线的时候&#xff0c;并发量小&#xff0c;用户使用的少&#xff0c;所以在低并发的情况下&#xff0c;一个jar包启动应用就够了&#xff0c;然后内部tomcat返回内容给用户。 但是慢慢的&#xff0c;使用我们平台的用户…

js当前时间格式化_JS时间格式化

因为new Date().toLocaleString() 在安卓和ios上的格式不一致&#xff0c;所以尽量自己写format生成一个时间数组作为一个简单的举例&#xff0c;我序列化一周的时间对象声明参数let lastMonth []let daylong 86400000判断时间值是否小于9const formatNumber num > { num…

springboot项目中使用shiro 自定义过滤器和token的方式___shiro使用token登录流程

springboot项目中使用shiro 自定义过滤器和token的方式 实现步骤主要是以下几步&#xff1a; 1. 在项目中导入maven依赖 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.4.0</versi…