uniapp 使用canvas制作柱状图

news/2025/2/6 1:07:56/

效果图:

在这里插入图片描述

实现思路:
1、通过展示数据计算需要画几根柱子;
2、通过组件宽度、高度计算出每根柱子的宽度及高度;
3、for循环依次绘制每根柱子;
4、绘制柱子时,先绘制顶部百分比、value值,再绘制柱子,再绘制底部标题;
5、文字需要居中,可绘制前丈量文字宽度再确定起始坐标。

<template><view class="container"><canvas canvas-id="columnarCanvas" id="columnarCanvas" style="width:750rpx; height:500rpx; margin-top:20px;" ></canvas><canvas canvas-id="testCanvas" style="width:750rpx; height:400rpx; background-color: #f8f8f8;"></canvas></view>
</template><script>export default {data() {return {canvasInfo: { },dataList: [{title: "玛莎拉蒂",value: 2}, {title: "奥迪",value: 8}, {title: "奔驰",value: 9}, {					title: "奔奔",value: 6}, {title: "保时捷",value: 4}, {title: "宝马",value: 7}, {title: "凯迪拉克",value: 3}]}},onReady() {this.getCanvasInfo()this.drawTest()},methods: {/** 获取节点信息,动态得到组件的宽度,高度 **/getCanvasInfo() {var view = uni.createSelectorQuery().in(this).select("#columnarCanvas"); view.fields({ size: true, rect: true }, res => {// console.log("得到节点信息" + JSON.stringify(res))var canvasInfo = {}canvasInfo.width = res.widthcanvasInfo.height = res.heightthis.canvasInfo = canvasInfo// 调用方法画图this.drawColumnar()}).exec();},/** 画图 **/drawColumnar() {const ctxColumnar = uni.createCanvasContext("columnarCanvas")var dataList = this.dataListvar canvasInfo = this.canvasInfovar columnarNum = dataList.lengthvar columnarWidth = (canvasInfo.width - 30) / (2 * columnarNum + 1)// console.log("宽度", columnarWidth)var maxColumnarHeight = canvasInfo.height - 60 - 20var maxColumnarValue = 0var totalValue = 0for (var i = 0; i < dataList.length; i++) {if (dataList[i].value > maxColumnarValue) {maxColumnarValue = dataList[i].value}totalValue = totalValue + dataList[i].value}for (var i = 0; i < dataList.length; i++) {ctxColumnar.setFontSize(15)var percent = parseInt(dataList[i].value * 100 / totalValue) + "%"var dx = columnarWidth * (2 * i + 1)var dy = canvasInfo.height - (maxColumnarHeight * (dataList[i].value / maxColumnarValue) + 60) + 10ctxColumnar.setFillStyle('#2b2b2b')var percentWidth = ctxColumnar.measureText(percent)ctxColumnar.fillText(percent, dx + columnarWidth / 2 - percentWidth.width / 2, dy)// ctxColumnar.setFillStyle('rgb(99, 112, 210)')ctxColumnar.setFillStyle(this.randomColor(i)) //指定每条柱子不同颜色var valueWidth = ctxColumnar.measureText(dataList[i].value + "")ctxColumnar.fillText(dataList[i].value + "", dx + columnarWidth / 2 - valueWidth.width / 2, dy + 20)ctxColumnar.fillRect(dx, dy + 22, columnarWidth, maxColumnarHeight * (dataList[i].value / maxColumnarValue))ctxColumnar.setFillStyle('#8a8a8a')var titleWidth = ctxColumnar.measureText(dataList[i].title + "")ctxColumnar.fillText(dataList[i].title, dx + columnarWidth / 2 - titleWidth.width / 2, canvasInfo.height - 10)}ctxColumnar.draw()},/**随机指定颜色**/randomColor(index) {let colorList = ["#63b2ee","#76da91","#f8cb7f","#7cd6cf","#f89588","#9192ab","#efa666","#7898e1","#eddd86","#9987ce","#76da91","#63b2ee"]// let index = Math.floor(Math.random() * colorList.length)return colorList[index]},/**画图测试**/drawTest() {const ctx = uni.createCanvasContext('testCanvas')let dataList = this.dataListlet x = 20, y = 0, w = 40, h = 20for (var i = 0; i < dataList.length; i++) {// 矩形ctx.fillStyle = this.randomColor(i)ctx.fillRect(x, y, w, h) // x,y,w,h// 设置字体样式ctx.font = 'bold 10px Arial'// 设置文本颜色ctx.fillStyle = this.randomColor(i)// 文本ctx.fillText(dataList[i].title, x+w+10, y+15)// 每行偏离距离y = y + 25}// 线条ctx.beginPath()ctx.moveTo(1, 1) //起点坐标ctx.lineTo(400, 1) //终点坐标ctx.stroke()// 进行绘制ctx.draw()}}}
</script><style></style>

http://www.ppmy.cn/news/1325532.html

相关文章

Java中的观察者模式应用场景

观察者模式&#xff08;Observer Pattern&#xff09;在Java中是一种常用的设计模式&#xff0c;主要用于实现当一个对象的状态发生变化时&#xff0c;其相关联的一组对象都能够得到通知并自动更新。这种模式主要适用于以下几种场景&#xff1a; 数据更新通知&#xff1a;当你…

Qt所有容器之间的区别,以及如何简单使用?

Qt中常用的容器有 QList、QVector、QMap、QHash、QSet 等,它们都具有不同的特性和适用场景。 1. QList:动态数组,可以动态增加和删除元素,支持随机访问和迭代,适用于不需要频繁插入或删除元素的场景。 ```cpp QList<int> list; list.append(1); list.append(2); fo…

MySQL索引的管理索引的使用原则以及SQL优化

索引的管理 查看索引 SHOW INDEX(或KEYS) FROM 表名; 删除索引 ALTER TABLE 表名 DROP PRIMARY KEY; DROP INDEX 索引名 ON 表名; ALTER TABLE 表名 DROP INDEX 索引名; 修改索引 ALERT TABLE 表名 ADD 索引类型&#xff08;数据列名&#xff09;;…

CSS实现图片放大缩小的几种方法

参考 方法一&#xff1a; 常用使用img标签&#xff0c;制定width或者height的任意一个&#xff0c;图片会自动等比例缩小 <div><img src"https://avatar.csdn.net/8/5/D/1_u012941315.jpg"/> </div> <!-- CSS--> <style> img {widt…

基于 Hologres+Flink 的曹操出行实时数仓建设

本文整理自曹操出行实时计算负责人林震基于 HologresFlink 的曹操出行实时数仓建设的分享&#xff0c;内容主要分为以下六部分&#xff1a; 曹操出行业务背景介绍曹操出行业务痛点分析HologresFlink 构建企业级实时数仓曹操出行实时数仓实践曹操出行业务成果分析未来展望 一、曹…

大模型学习与实践笔记(九)

一、LMDeply方式部署 使用 LMDeploy 以本地对话方式部署 InternLM-Chat-7B 模型&#xff0c;生成 300 字的小故事 2.api 方式部署 运行 结果&#xff1a; 显存占用&#xff1a; 二、报错与解决方案 在使用命令&#xff0c;对lmdeploy 进行源码安装是时&#xff0c;报错 1.源…

openssl3.2 - 官方demo学习 - pkey - EVP_PKEY_RSA_keygen.c

文章目录 openssl3.2 - 官方demo学习 - pkey - EVP_PKEY_RSA_keygen.c概述笔记END openssl3.2 - 官方demo学习 - pkey - EVP_PKEY_RSA_keygen.c 概述 官方指出 : RSA key 如果小于2048位, 就属于弱key 官方demo中, 给出的默认key长度为4096位 从名字生成上下文 初始化上下文…

使用C语言实现模型的推理(一)

使用C语言实现模型的推理&#xff08;一&#xff09; WHY&#xff1f;思路整理从怎么把大象放到冰箱里开始怎么让模型推理跑起来 生成一个模型理清楚算子之间的依赖关系获取tensor信息获取依赖信息获取模型的运算图拓扑排序 TO DO其他biasDELEGATE WHY&#xff1f; 现在推理框…