热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于javascript:canvas-柱形图

在用uni-app做我的项目时,偶尔遇到一个中央须要柱形图,因为插件没找到适合的,本人就写了一个,分享给大家,如果有写得不好的中央,请大家多多指教。
canvas 柱形图

前言

在用uni-app做我的项目时,偶尔遇到一个中央须要柱形图,因为插件没找到适合的, 本人就写了一个,分享给大家,如果有写得不好的中央,请大家多多指教。

效果图

性能:通过X轴数组的长度,计算失去每段的宽度,从而能够实现图像宽度和地位的主动调配。通过Y轴数组最大值和最小值,计算出柱形在Y轴下面对应的坐标,从而实现图形比例调配高度。自定义宽高,未定义宽度时,自适应屏幕宽度。

绘制剖析

这个图标由xy轴、数据条形组成。

  • 轴线: 应用moveTo(x, y)lineTo(x, y)实现
  • 文字:应用fillText( text, x, y)实现
  • 长方形: 应用 fillRect(x, y, width, height )实现

实现步骤

–显示的数据

 itemsX: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月',],
 itemsY: [65, 35, 43, 77, 75, 48, 95, 80, 65, 35, 43, 77],

–定义画布

 
 

–计算Y轴上的刻度值数据

算出Y轴每段的长度,通过进行for循环,将每段的刻度值顺次保留到yScales数组中

Y轴每段长度 = (y轴最大值 – y轴最小值) / 总段数

getyScale () { 
      let length = (this.maxNum - this.yAxisMinNum) / this.yNumber 
      for (let index = 0; index 

–x轴和y轴的每段长度

计算出xy轴每段的长度,再通过for循环,每段的长度乘以for循环的索引值就能够失去每段在Y轴线和Y轴线上的坐标点

padding是给文字预留边距

XY轴每段长度 = (总长度 – 两边的边距)/ 总的段数

this.xLength = Math.floor((this.canvasWidth - this.padding * 2) / this.itemsX.length)
this.yLength = Math.floor((this.height - this.padding * 2) / this.yNumber)

–绘制刻度和刻度值

1.计算在轴线上的坐标点
坐标点 = 每段长度 * 对应第几段的索引值

let newlength = length * (index + 1)

2.绘制刻度

通过context.moveTo()context.lineTo()绘制刻度

context.moveTo(this.padding + newlength, this.height - this.padding)
context.lineTo(this.padding + newlength, this.height - this.padding + 5) 

3.绘制刻度值

刻度值通过for循环的在数组中失去对应的值,同时因为点位会间接定到轴线上,所应依据状况,增加偏移量

 context.fillText(items[index], this.padding - 15, this.height - this.padding - newlength + 5);

–绘制柱形图

1.计算柱形图高度

总高度减去预留两边的预留边距 乘以 Y轴数组的值除以总高度

通过去除边距的总高度Y轴对应刻度的值除以最大值的百分比计算出每个

柱形图的高度 = (总高度 – 两边边距)* ((Y轴对应的刻度值 – Y轴最小值)/ (Y轴最大值 – Y轴最小值)

let yHeight = Math.ceil((this.height - (this.padding * 2)) * ((this.itemsY[index] - this.yAxisMinNum) / (this.maxNum - this.yAxisMinNum)))  

2.计算fillRecty轴坐标值

因为canvas起始坐标(0,0)是左上角,所以要用总高度减去下方边距减去柱状图边距,从而失去y轴的坐标

let y = this.height - this.padding -yHeight 

3.计算fillRectx轴坐标值和宽度

宽度是每段长度的一半,所以为了保障图像在每段居中,x轴的坐标值就须要在每段4分之1的地位开始,因而在索引值前面须要加上一个0.25

let xWidth = this.xLength / 2let x = this.padding + this.xLength * (index + 0.25)

4.绘制柱形图

将计算的z,y坐标和对应的宽度长度填入context.fillRect()

context.fillRect(x, y, this.xLength / 2, yHeight,)

残缺代码

属性名 类型 默认值 是否必须 阐明
itemsX Array [ ] x轴显示数据
itemsY Array [ ] y轴显示数据
maxNumy Number y轴显示数据最大值 y轴刻度值最大值,小于y轴显示数据最大值时,替换为y轴显示最大值
minNumy Number 0 y轴刻度值最小值,大于y轴显示数据最小值时,替换为y轴显示最小值
width Number 屏幕宽度 图像宽度
height Number 500 图像高度
padding Number 30 图像边距
graphColor String ‘#000000’ 柱形图色彩
   data () {    return {      //自定义的变量      itemsX: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月',],      itemsY: [65, 35, 43, 77, 75, 48, 95, 80, 65, 35, 43, 77],      maxNumy: 0,      minNumy: 0,      width: 768,      height: 500,      yNumber: 5,      padding: 30,      graphColor: '#72f6ff',              //非自定义      yScales: [], //y轴上刻度值数组      xLength: '', //x轴每段长度      yLength: '', //y轴每段长度      scaleIntervalMax: '',  //y轴刻度值最大值      scaleIntervalMin: '',  //y轴刻度值最小值    }  },  computed: {    yAxisMinNum () { // 判断最小值是否大于itmsY数组中的最小值,大于则替换      return this.minNumy  this.maxNumy ? this.getMaxNum(this.itemsY) : this.maxNumy      this.scaleIntervalMin = this.getMinNum(this.itemsY)    this.getyScale()    this.getSingleLengths()    this.drawCanvas()  },  methods: {    getyScale () { // 取得y轴上刻度值数组      let length = (this.scaleIntervalMax - this.yAxisMinNum) / this.yNumber      for (let index = 0; index  num ? num = cur : null      }      return num    },    getMinNum (items) {      let num = items[0]      let cur      for (let i = 1; i 

推荐阅读
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • JVM钩子函数的应用场景详解
    本文详细介绍了JVM钩子函数的多种应用场景,包括正常关闭、异常关闭和强制关闭。通过具体示例和代码演示,帮助读者更好地理解和应用这一机制。适合对Java编程和JVM有一定基础的开发者阅读。 ... [详细]
  • 本文总结了Java初学者需要掌握的六大核心知识点,帮助你更好地理解和应用Java编程。无论你是刚刚入门还是希望巩固基础,这些知识点都是必不可少的。 ... [详细]
  • 【妙】bug称它为数组越界的妙用
    1、聊一聊首先跟大家推荐一首非常温柔的歌曲,跑步的常听。本文主要把自己对C语言中柔性数组、零数组等等的理解分享给大家,并聊聊如何构建一种统一化的学习思想 ... [详细]
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
author-avatar
君与龙_501
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有