当前位置: 首页 > web >正文

uniapp中用canvas绘制简单柱形图,小容量,不用插件——简单使用canvas

uniapp中用canvas绘制简单柱形图,小容量,不用插件——简单使用canvas

在这里插入图片描述

完整代码

<template><view><!-- 学习数据 --><!-- 头部选项卡 --><view class="navTab"><view :class="listIndex==i?'activite':''" @click="gopage(i)" v-for="(item,i) in navList" :key="i">{{item}}</view></view><!-- 不同的图表 --><view id="mycan"><canvas style="height: 250px;" canvas-id="DataCanvas" class='canvasII'></canvas></view></view>
</template><script>export default {data() {return {title: '学习数据',canvasList: [{date:"9-12",num:0},{date:"9-13",num:24},{date:"9-14",num:100},{date:"9-15",num:45},{date:"9-16",num:15},{date:"9-17",num:54},{date:"9-18",num:10}],width:300,height:200,canPersent: [] ,//百分比数组listIndex:0,navList:["最近七天","最近七个月"],}},onLoad() {this.showChart()},methods: {gopage(i){this.listIndex = iif(i == 0){this.canvasList = [{date:"9-12",num:0},{date:"9-13",num:24},{date:"9-14",num:100},{date:"9-15",num:45},{date:"9-16",num:15},{date:"9-17",num:54},{date:"9-18",num:10}], //测试数据this.showChart()}else if( i == 1){this.canvasList = [{date:"3月",num:0},{date:"4月",num:234},{date:"5月",num:120},{date:"6月",num:145},{date:"7月",num:15},{date:"8月",num:543},{date:"9月",num:10}], //测试数据this.showChart()}},// 坐标图showChart() {const ctx = uni.createCanvasContext("DataCanvas")ctx.lineWidth = 1;// 横坐标ctx.beginPath(); //新建一条pathctx.setStrokeStyle('#c6c6c6')ctx.moveTo(20, this.height); //把画笔移动到指定的坐标ctx.lineTo(this.width, this.height); //绘制一条从当前位置到指定坐标(200, 50)的直线.ctx.closePath(); //闭合路径。会拉一条从当前点到path起始点的直线。如果当前点与起始点重合,则什么都不做ctx.stroke(); //绘制路径。// 纵坐标ctx.beginPath();ctx.moveTo(20, 0);ctx.lineTo(20, this.height);ctx.closePath();ctx.stroke();var max = 0 //最大值// 找到最大的数for (var i = 0; i < this.canvasList.length; i++) {if(this.canvasList[i].num >= max){max = this.canvasList[i].num}}console.log("max---->",max);// 计算百分比: 以数组中最大的为100%,来计算其他的百分比for (var i = 0; i < this.canvasList.length; i++) {this.canPersent[i] = (this.canvasList[i].num / max) * (this.height-40) // -10 ,防止太高溢出头}console.log(this.canPersent);// 柱状图之间的间隔// 绘制7个粗线条 (300-20)/7 = 40,所以 i 每次要加上40  20为左右间隔var gap = (this.width - 10*2) / this.canPersent.lengthconsole.log("--gap----->",gap);for (var i = 0; i < this.canPersent.length; i++) {// 横坐标的数据ctx.fillText(this.canvasList[i].date, 30 + gap * i, 220);// 柱状图上的数据ctx.fillText(this.canvasList[i].num, 33 + gap * i, this.height - this.canPersent[i] - 15);if(this.canPersent[i] == 0){i++ctx.fillText(this.canvasList[i].date, 30 + gap * i, 220);ctx.fillText(this.canvasList[i].num, 33 + gap * i, this.height - this.canPersent[i] - 15);}ctx.beginPath();ctx.setStrokeStyle('#F36521') //设置柱状图颜色ctx.moveTo(40 + gap*i, this.height - this.canPersent[i] - 6);ctx.lineTo(40 + gap*i, this.height - 6);ctx.lineWidth = 10;ctx.lineCap = "round"; //设置线条样式ctx.stroke();}ctx.draw()},}}
</script><style>#mycan {margin: 20px;}.navTab{display: flex;justify-content: space-evenly;margin: 3px 0;}.activite{color: #fc722d;padding: 3px 0;border-bottom: 3px #fc722d solid;}
</style>
http://www.xdnf.cn/news/3984.html

相关文章:

  • QT 在圆的边界画出圆
  • IP属地是我的定位吗?——解析两者区别
  • Python异步编程入门:从同步到异步的思维转变
  • VBA信息获取与处理专题五:VBA利用CDO发送电子邮件
  • 【外围电路】按键电路设计外接信号输入设计
  • Go小技巧易错点100例(二十九)
  • rollout 是什么:机器学习(强化学习)领域
  • 【Vue】Vue3源码解析与实现原理
  • 关于 dex2oat 以及 vdex、cdex、dex 格式转换
  • VLA算法总结对比——RT1 / RT2 / Pi0 / Octo/ RDT / OpenVLA
  • 钩子函数和参数:Vue组件生命周期中的自定义逻辑
  • 2.3 向量组
  • Linux电源管理(6)_Generic PM之挂起功能
  • Ubuntu K8S(1.28.2) 节点/etc/kubernetes/manifests 不存在
  • n8n工作流自动化平台:生成图文并茂的分析报告之Merge节点详细说明
  • labelimg快捷键
  • DXFViewer进行中 : ->封装OpenGL -> 解析DXF直线
  • SpringMVC框架详解与实践指南
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】4.3 数据脱敏与安全(模糊处理/掩码技术)
  • 力扣119题解
  • 六、shell脚本--正则表达式:玩转文本匹配的“万能钥匙”
  • Java使用JDBC操作数据库
  • OpenCV进阶操作:图像直方图、直方图均衡化
  • 2.CFD 计算过程概述:Fluent在散热计算中的优势
  • 【Linux】linux入门——基本指令
  • Qt 信号槽机制底层原理学习
  • C++笔记之模板与可变参数模板
  • 动态链接库(DLL)
  • 网狐飞云娱乐三端源码深度实测:组件结构拆解与部署Bug复盘指南(附代码分析)
  • LeetCode 热题 100 17. 电话号码的字母组合