更新记录

1.0.8(2026-02-09)

新增加山峰图表mountain 为了方便自定义颜色增加或修改了数据配置属性 柱状图增加了自定义线性渐变,详情请看下面文档。

1.0.7(2026-02-04)

新增加雷达图radar2 雷达图模式下type属性有原来的radar改为radar1和radar2可分别生成不同的效果。

1.0.6(2026-01-26)

雷达图添加自定义是否显示数字,如果不需要显示数字 设置isnum为false即可。

查看更多

平台兼容性

uni-app x(4.42)

Chrome Safari Android iOS 鸿蒙 微信小程序
- 5.0 - - -

wui-charts开发文档介绍

简介:

wui-charts 它不是通过 Webview 套壳来实现图表功能,而是纯UTS编写 Canvas 绘制的轻量级图表库,
弥补了 uniapp-x 在app端渲染画布图表追求性能的需求,同时也填补了uniapp-x的插件生态
目前包含了大多数常用的图表,后期会陆续增加。特此声明:不兼容旧版uniapp他是uniapp-x的api

优势:

纯 UTS 编写:wui-charts 完全采用 UTS 编程语言,保证了图表的执行效率和性能。
Canvas 绘制:直接在 Canvas 上绘制图表,避免了 Webview 的性能开销,使得图表更加流畅。
轻量级:无需依赖额外的 Webview,减少了应用的包体积,提升了加载速度。

使用说明:

通过插件市场下载会自动导入插件到项目中之后只需简单三部。

1.在使用的页需面引入插件。
import { wuiCharts } from '@/uni_modules/wui-charts';
2.实例化wui-charts插件并绑定Canvas的id 以vue的选项api为例。
<template>
    <view style="background-color: aqua;align-items: center;padding:2px; ">
        <canvas canvas-id="canvas" id="canvas" @click="setData"></canvas>
    </view>
</template>
export default {
    import { wuiCharts } from '@/uni_modules/wui-charts';
    data() {
        return {
            // 处理双击事件
            clickTimes: 0,
            //实例化插件传入canvas的id
            charts: null as wuiCharts | null,
            //初始化前准备的配置项
            opts: {
                //图表类型
                type: 'columnar1',
                //初始化canvas的宽请与css设置一直rpx需要转成px
                width: 350,
                //初始化canvas的高请与css设置一直rpx需要转成px
                height: 250,
                //初始化canvas的背景色
                bgColor: 'rgba(255,255,255,1)',
                //初始化内边距,绘制时按照内边距向内绘制
                padding: 10,
                //初始竖轴刻度和参照标识
                reference: ["0", "20", "40", "60", "80", "100"],
                //初始横轴刻度和参照标识和数据长度一直,设置series后会覆盖data中每一项的seriesName
                series: ['2021', '2022', '2023', '2024', '2025', '2026', '2027'],
                //动画过度时间animate为true时有效
                speed: 50,
                //是否开启过度动画,设定固定数据时的过度动画
                animate: true,
                //总刻度值,数据参照的最大值
                total: 100,
                numDisplayTop:true,//数据数字true在定部显示,false在矩形内部显示
                data: [
                    { "seriesName": '2021', "value": 30, cPeak: '#555', cTop: 'rgba(0, 180, 160, 0.6)', cBottom: 'green' },
                    { "seriesName": '2022', "value": 90, cPeak: '#555', cTop: 'rgba(0, 180, 160, 0.3)', cBottom: 'green' },
                    { "seriesName": '2023', "value": 50, cPeak: '#555', cTop: 'rgba(0, 180, 160, 0.3)', cBottom: 'green' },
                    { "seriesName": '2024', "value": 100, cPeak: '#555', cTop: 'rgba(0, 180, 160, 0.3)', cBottom: 'green' },
                    { "seriesName": '2025', "value": 60, cPeak: '#555', cTop: 'rgba(0, 180, 160, 0.3)', cBottom: 'green' },
                    { "seriesName": '2026', "value": 40, cPeak: '#555', cTop: 'rgba(0, 180, 160, 0.3)', cBottom: 'green' },
                    { "seriesName": '2027', "value": 30, cPeak: '#555', cTop: 'rgba(0, 180, 160, 0.3)', cBottom: 'green' },
                ] as UTSJSONObject[]
            } as UTSJSONObject,
            //数据和横轴series长度一直
            data: [] as UTSJSONObject[]
        }
    },
    onLoad() {
        this.data = this.opts.data as UTSJSONObject[];
    },
    onReady() {
        //初始化画布
        this.charts = new wuiCharts('canvas', this.opts);
    },
    methods: {
        /* 更新canvas数据 */
        setData(e : UniPointerEvent) {
            this.clickTimes++;
            if (this.clickTimes == 2) {
                this.clickTimes = 0;
                //  处理双击事件...
                this.charts!.setSpeed(50);
                this.charts!.setAnimate(true);
                this.charts!.drawing(this.data);
            }
            setTimeout(() => {
                if (this.clickTimes == 1) {
                    this.clickTimes = 0;
                    //  处理单击事件...
                    this.charts!.menuEvent(e.clientX, e.clientY);
                }
            }, 250)
        }

    }
}
vue组合API 简单实用实例

vue组合API也是在生命周期onReady之后初始化画布和更新数据。

<template>
    <scroll-view style="flex:1" bounces="false">
        <view style="background-color: aqua;align-items: center;padding:2px; ">
            <canvas canvas-id="canvas" id="canvas" @click="setData"></canvas>
        </view>
    </scroll-view>
</template>

<script setup lang="uts">
    /* 引入wui-charts插件 */
    import { wuiCharts } from '@/uni_modules/wui-charts';
    let charts : wuiCharts | null = null;
    let clickTimes = 0;
    let data = [
        { seriesName: '一班', value: 80,cPeak: '#666', cTop: '#00CFF9', cBottom: 'rgba(0, 150, 220, 0.3)' },
        { seriesName: '二班', value: 120, cPeak: '#666', cTop: '#00E8C6', cBottom: 'rgba(0, 180, 160, 0.3)' },
        { seriesName: '三班', value: 70, cPeak: '#666', cTop: '#FFE880', cBottom: 'rgba(255, 190, 80, 0.3)' },
        { seriesName: '四班', value: 100, cPeak: '#666', cTop: '#FFA8A8', cBottom: 'rgba(255, 120, 120, 0.3)' },

    ] as UTSJSONObject[];
    let opts = {
        //图表类型
        type: 'mountain',
        //初始化canvas的宽请与css设置一直rpx需要转成px
        font: 10,
        width: 350,
        //初始化canvas的高请与css设置一直rpx需要转成px
        height: 250,
        //初始化canvas的背景色
        bgColor: 'rgba(255,255,255,1)',
        //初始化内边距,绘制时按照内边距向内绘制
        padding: 10,
        //初始横轴刻度和参照标识和数据长度一直,设置series后会覆盖data中每一项的seriesName
        series: ['2021', '2022', '2023', '2024'],
        //初始竖轴刻度和参照标识
        reference: ["0", "20", "40", "60", "80", "100", "120"],
        //总刻度值,数据参照的最大值
        // total: 100,
        //动画过度时间animate为true时有效
        speed: 50,
        //是否开启过度动画,设定固定数据时的过度动画
        animate: true,
        data: data
    } as UTSJSONObject;

    onReady(() => {
        charts = new wuiCharts('canvas', opts);
    });
    /* 更新canvas数据 */
    let setData = (e : UniPointerEvent) => {
        clickTimes++;
        if (clickTimes == 2) {
            clickTimes = 0;
            //  处理双击事件...
            charts!.setSpeed(50);
            charts!.setAnimate(true);
            charts!.drawing(data);
        }
        setTimeout(() => {
            if (clickTimes == 1) {
                clickTimes = 0;
                //  处理单击事件...
                charts!.menuEvent(e.clientX, e.clientY);
            }
        }, 250)
    }
</script>

wui-charts目前暴露的方法有drawing ,setSpeed,setAnimate,getPainted,getimgData,toDataURL,clear,menuEvent,setScale

其余的绘制方法都是模块化的只需在初始化传入的opts配置项中配置即可。

除了type是必须配置其他可忽略。
注意:初始化绑定了 canvas 的 id 后设置canvas的宽和高只有在opts配置有效,css设置宽和高无效果,其它css属性可以正常设置。

每个图表种类的配置项说明

columnar1 单柱状图 columnar2 重叠双柱状图 columnar3 正负单柱状图  line1 单折线图 和 line2 多折线图 mountain山峰图 配置都是一样的
    opts:{          
        type: 'columnar1',                                       //图表类型 必须
        font: 10,                                                //字体大小
        width: 350,                                              //画布的宽 
        height: 250,                                             //画布的高 
        bgColor: 'rgba(255,255,255,1)',                          //初始化canvas画布的背景色  
        padding: 10,                                             //初始化内边距,绘制时按照内边距向内绘制
        reference: ["0", "200", "400", "600", "800", "1000"],    //初始竖轴刻度和参照标识  
        series: ['2021', '2022', '2023', '2024', '2025', '2026'],//初始横轴刻度和参照标识和数据长度一直,设置series后会覆盖data中每一项的seriesName               
        speed: 50,                                               //动画过度时间animate为true时有效    
        animate: true,                                           //是否开启过度动画,设定固定数据时的过度动画
        total: 1000,                                             //总刻度值,数据参照的最大值
        numDisplayTop:true,                                      //数据数字true在定部显示,false在矩形内部显示
        data:[] as UTSJSONObject[]                               //渲染的数据具体介绍参照下面每个图表种类的data数据说明
    }

pieshaped 饼状图
    opts:{
        type: 'pieshaped',                                       //图表类型 必须
        font: 10,                                                //字体大小
        width: 350,                                              //画布的宽
        height: 250,                                             //画布的高 
        bgColor: 'rgba(255,255,255,1)',                          //初始化canvas画布的背景色
        padding: 50,                                             //初始化内边距,绘制时按照内边距向内绘制
        speed: 50,                                               //动画过度时间animate为true时有效
        animate: true,                                           //是否开启过度动画,设定固定数据时的过度动画
        isCatoy: true,                                           //是否显示颜色类别图例
        series:['1','2','3','4','5']                             //初始横轴刻度和参照标识和数据长度一直,设置series后会覆盖data中每一项的seriesName
        data:[] as UTSJSONObject[]                               //渲染的数据具体介绍参照下面每个图表种类的data数据说明
    }
radar1雷达图 和 radar2 雷达图
    opts:{
        type: 'radar1',                                          //图表类型 必须
        width: 350,                                              //画布的宽                                         
        height: 250,                                             //画布的高 
        bgColor: 'rgba(255,255,255,1)',                          //初始化canvas画布的背景色
        fillColor:'rgba(0,66,0,0.3)',                            //雷达区域数据填充色 type为radar有效
        dotColor:'#000',                                         //圆点颜色 type为radar1有效
        textColor:'#000',                                        //标题颜色 type为radar1有效
        numColor:'#0000ff',                                      //数字颜色 type为radar1有效
        gridColor:'#000',                                        //网格颜色 type为radar1有效
        gridFill:[255,255,255],                                  //网格填充透明色数组形式呈现长度3,0到255之间 type为radar1有效
        isnum:false,                                             //是否显示数字默认为true显示  type为radar1有效
        series:['1','2','3','4','5','6'],                        //初始横轴刻度和参照标识和数据长度一直,设置series后会覆盖data中每一项的seriesName   
        padding: 68,                                             //初始化内边距,绘制时按照内边距向内绘制
        speed: 50,                                               //动画过度时间animate为true时有效
        animate: true,                                           //是否开启过度动画,设定固定数据时的过度动画
        data:[] as UTSJSONObject[]                               //渲染的数据具体介绍参照下面每个图表种类的data数据说明
    }

dashboard 仪表盘
    opts:{
        type: 'dashboard',                                      //图表类型  必须  
        width: 350,                                             //画布的宽
        height: 200,                                            //画布的高
        bgColor: 'rgba(255,255,255,1)',                         //初始化canvas画布的背景色
        padding: 20,                                            //初始化内边距,绘制时按照内边距向内绘制
        total: 100,                                             //总刻度
        speed: 50,                                              //动画过度时间animate为true时有效
        animate: true,                                          //是否开启过度动画,设定固定数据时的过度动画
        data: 90                                                //数据值
    }

annular 环形进度条       
    opts:{
        type: 'annular',                                        //图表类型  必须  
        width: 110,                                             //画布的宽
        height: 110,                                            //画布的高
        lineWidth: 5,                                           //进度条的粗细
        bgcolor: 'rgba(255,255,255,1)',                         //初始化canvas画布的背景色   
        padding: 20,                                            //初始化内边距,绘制时按照内边距向内绘制
        speed: 50,                                              //动画过度时间animate为true时有效
        animate: true,                                          //是否开启过度动画,设定固定数据时的过度动画
        data: 50,                                               //数据值   
    }
ball 水球波纹进度
    opts:{
        type: 'ball',                                           //图表类型  必须
        width: 120,                                             //画布的宽
        height: 120,                                            //画布的高
        lineWidth: 0,                                           //水球边缘粗细
        bgcolor: '#fff',                                        //初始化canvas画布的背景色
        speed: 50,                                              //动画过度时间animate为true时有效
        animate: true,                                          //是否开启过度动画,设定固定数据时的过度动画
        data: 80,                                               //数据值
    }

每个图表种类的data数据说明

columnar1 单柱状图 columnar2 重叠双柱状图 columnar3 正负单柱状图
    //如果在opts里设置了series长度要和 opts的series要和data的长度 保持一直
    data:[{ 
            seriesName: '系列1',   //对应的柱状名称如果在配置设置了optss的series会覆盖到data.seriesName
            value: 30,             //数据值
            cPeak: '#555',        //柱状图的数字颜色
            cTop: '#888',         //柱状图的顶部渐变色如果不需要渐变和cBottom设置一样即可
            cBottom: 'green'      //柱状图的底部部渐变色如果不需要渐变和cBottom设置一样即可
            target: 400,          //目标数据值仅在columnar2 重叠双柱状图设置有效
    }] as UTSJSONObject[]

mountain 山峰图
    //如果在opts里设置了series长度要和 opts的series要和data的长度 保持一直
    data:[{ 
            seriesName: '一班', //对应的山峰图名称如果在配置设置了optss的series会覆盖到data.seriesName
            value: 80,          //数据值
            cPeak: '#666',      //山峰图的数字颜色
            cTop: '#00CFF9',    //山峰图的顶部渐变色如果不需要渐变和cBottom设置一样即可 
            cBottom: 'rgba(0, 150, 220, 0.3)' //山峰图的底部部渐变色如果不需要渐变和cBottom设置一样即可
        }] as UTSJSONObject[];

line1 单折线图
    //如果在opts里设置了series长度要和 opts的series要和data的长度 保持一直
    data:[{
            seriesName: '2021',   //对应的柱状名称如果在配置设置了optss的series会覆盖到data.seriesName
            lineColor":'#0000ff', //每条线段的颜色,不设置默认黑色
            value: 300            //数据值
    }] as UTSJSONObject[]

line2 多折线图
    //长度最多支持4项
    data: [{            
            name: '酸枣仁',       //每项的名称
            lineColor: 'red',     //每项颜色不设置默认黑色
        data:[{
        value:200,               //数据值
        }]
    }] as UTSJSONObject[]

pieshaped 饼状图
    //如果在opts里设置了series长度要和 opts的series要和data的长度 保持一直
    //如果在opts里没有设置series则data长度无要求,适度即可
    data:[{
        value: 30,              //数据值
        areaColor: "black",     //每一项的颜色
        seriesName: "一班"      //每一项的标题名称如果在配置设置了optss的series会覆盖到data.seriesName
    }] as UTSJSONObject[]

radar1 和 radar2 雷达图
    //如果在opts里设置了series长度要和 opts的series要和data的长度 保持一直
    //如果在opts里没有设置series则data长度无要求,适度即可
    data:[{
        "value": 70,            //数据值
        "seriesName": "超大盘",  //每一项的标题名称如果在配置设置了optss的series会覆盖到data.seriesName
    }] as UTSJSONObject[]

dashboard 仪表盘
    //需要在初始化opts的时候配置 total 总刻度,如不配置默认是100      
    data:80,                   //数据值number类型

annular 环形进度条       
    data:80,                   //数据值number类型

ball 水球波纹进度     
    data:80,                   //数据值number类型

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率: