更新记录
2.1.0(2026-09-13)
- 适配鸿蒙、安卓、ios等设备的折叠屏、阔折叠形态;
- 完善折叠屏适配示例代码。
2.0.0(2026-09-13)
- 适配 uni-app x 蒸汽模式(vapor),与 VDOM 共用同一套组件和 option;
- 完善文档说明。
1.3.6(2026-08-26)
- 修复已知问题。
- 示例工程项目中增加文档。
平台兼容性
uni-app x(4.81)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ |
其他
| 多语言 | 暗黑模式 | 宽屏模式 | 蒸汽模式 |
|---|---|---|---|
| × | √ | √ | √ |
umi-charts-x
uni-app x 图表组件库。App 端使用原生 DrawableContext 绘制,小程序 / 鸿蒙元服务使用 Canvas 2D 绘制,配置风格接近 ECharts option。
仅支持 uni-app x(uvue + UTS),不支持传统 uni-app(vue/nvue)。 同时支持 VDOM 与 vapor(蒸汽模式)。 要求 HBuilderX
^4.41、uni-app x^4.41。 导入示例项目,可以查看图表渲染效果以及示例代码。
特性:
- 19 种图表组件,easycom 即用
- 支持 vapor 蒸汽模式(与 VDOM 同一套组件与
option) - App 原生绘制,小程序 Canvas 2D,同一套
option - 触摸 Tooltip、深色模式、折叠屏宽屏自适应
- UTS 实现,支持 Android / iOS / 鸿蒙 / 微信小程序,上述端均开启摇树
查询配置: https://umi-d3gs10wf324913a53-1306321853.tcloudbaseapp.com/umi/umi-charts.html
安装
- 从 DCloud 插件市场 导入本插件到项目
uni_modules/umi-charts-x - 组件符合 easycom 规范,导入后无需 import、无需注册,页面中直接使用标签即可
若编译器未自动识别,在项目 pages.json 中补充:
{
"easycom": {
"autoscan": true,
"custom": {
"^umi-(.*)": "@/uni_modules/umi-charts-x/components/umi-$1/umi-$1.uvue"
}
}
}
快速开始
UTS 中请使用 mkOption() / mkSeries() 创建配置,不要写对象字面量。
<template>
<umi-line :option="option" :height="440"></umi-line>
</template>
<script setup lang="uts">
import { mkOption, mkSeries, ECOption, SeriesOpt } from '@/uni_modules/umi-charts-x'
const option = computed(() : ECOption => {
const o = mkOption()
const xa = o.xAxis
if (xa != null) {
xa.data = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] as string[]
}
const s = mkSeries()
s.data = [150, 230, 224, 218, 135, 147, 260] as number[]
o.series = [s] as SeriesOpt[]
return o
})
</script>
柱状图只需把组件换成 umi-bar,并把 s.type 设为 'bar':
<umi-bar :option="option" :height="440"></umi-bar>
s.type = 'bar'
组件列表
| 组件 | series.type | 说明 |
|---|---|---|
umi-line |
line |
折线 / 面积 / 阶梯 |
umi-bar |
bar |
柱状图 |
umi-pictorial-bar |
pictorialBar |
象形柱图 |
umi-pie |
pie |
饼图 |
umi-scatter |
scatter |
散点 / 气泡 |
umi-effect-scatter |
effectScatter |
涟漪散点 |
umi-candlestick |
candlestick |
K 线 |
umi-radar |
radar |
雷达图 |
umi-boxplot |
boxplot |
盒须图 |
umi-heatmap |
heatmap |
热力图 |
umi-graph |
graph |
关系图 |
umi-lines |
lines |
路径飞线 |
umi-tree |
tree |
树图 |
umi-treemap |
treemap |
矩形树图 |
umi-sunburst |
sunburst |
旭日图 |
umi-parallel |
parallel |
平行坐标 |
umi-sankey |
sankey |
桑基图 |
umi-funnel |
funnel |
漏斗图 |
umi-gauge |
gauge |
仪表盘 |
通用属性
所有图表组件属性一致:
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| option | ECOption |
mkOption() |
图表配置 |
| width | string \| number |
'100%' |
宽度。纯数字按 rpx |
| height | string \| number |
400 |
高度。纯数字按 rpx |
示例:
<umi-line :option="option" width="100%" :height="440"></umi-line>
<umi-pie :option="option" height="500rpx"></umi-pie>
折叠屏 / 宽屏自适应
图表组件内部会监听 onResize 并重绘,折叠、展开、分屏后画布会跟着变。若业务上要按窗口宽度换尺寸或布局,在页面里改 width / height 即可。
示例工程首页「折线图」卡片,以及 common/demos.uts:
| 示例 | demo id | 方案 |
|---|---|---|
| 折叠屏适配(px) | line-fold-px |
固定物理像素,如 width="320px" height="200px",避免 rpx 在宽屏被放大 |
| 折叠屏适配( 断点) | line-fold-resize |
推荐。按窗口宽度断点动态改尺寸 |
鸿蒙栅格:xs [0, 320)、sm [320, 600)、md [600, 840)、lg [840, +∞)。通常 < 600 小屏(折叠态),>= 600 大屏(展开 / 阔折叠)。
推荐写法(与 line-fold-resize 一致):
<template>
<umi-line :option="option" :width="chartW" :height="chartH"></umi-line>
</template>
const chartW = ref(280)
const chartH = ref(180)
const syncSize = (windowWidth : number) => {
if (windowWidth < 600) {
chartW.value = 280
chartH.value = 180
} else {
chartW.value = 640
chartH.value = 280
}
}
((res) => {
syncSize(res.size.windowWidth)
})
syncSize(uni.getWindowInfo().windowWidth)
option 配置
完整 option 字段可在线 查询配置。
通过 mkOption() 得到 ECOption:
| 字段 | 类型 | 说明 |
|---|---|---|
| color | string[] |
调色盘 |
| backgroundColor | string |
背景色。#000 / #000000 / black 时进入深色模式 |
| tooltip | TooltipOpt \| null |
触摸提示。show 默认 true,可按 ECharts 方式自定义 |
mkOption() 已创建 tooltip,访问前判空。五大类自定义:
内容自定义 formatter
字符串模板(与 ECharts 相同占位符):
const t = o.tooltip
if (t != null) {
t.formatter = '{b}<br/>{a}:{c}'
}
{a} 系列名,{b} 类目,{c} 数值,{d} 百分比;多系列 {a0} {c1}。
函数形式:
import { TooltipParams } from '@/uni_modules/umi-charts-x'
t.formatterFn = (p : TooltipParams, ticket : string, cb : (tk : string, html : string) => void) : string => {
return p.title + '<br/>' + p.items[0].seriesName + ':' + p.items[0].valueText
}
样式自定义
import { mkTooltipTextStyle } from '@/uni_modules/umi-charts-x'
t.backgroundColor = 'rgba(255,255,255,0.96)'
t.borderColor = '#5470C6'
t.borderWidth = 1
t.padding = 12
const ts = mkTooltipTextStyle()
ts.color = '#1D2129'
ts.fontSize = 14
t.textStyle = ts
t.extraCssText = 'background:#fff;color:#333'
位置自定义
t.position = 'top' // top / bottom / left / right / inside
t.confine = true
t.positionFn = (point : number[], _p : TooltipParams, size : number[]) : number[] => {
return [point[0] + 12, point[1] - size[1] - 8] as number[]
}
异步 tooltip
与 ECharts 相同:先返回占位文案,再 callback(ticket, html)。
t.formatterFn = (p : TooltipParams, ticket : string, cb : (tk : string, html : string) => void) : string => {
setTimeout(() => {
cb(ticket, p.title + '<br/>已加载')
}, 600)
return p.title + '<br/>加载中...'
}
完全自定义内容
uni-app x 没有浏览器 DOM,提示画在 Canvas 上。用 formatterFn 返回完整 HTML 字符串(支持 <br/>,其余标签会去掉),再用 backgroundColor / extraCssText 做皮肤。若要用自己的 view 浮层:t.showContent = false,在 formatterFn 里更新自己的界面。
| xAxis | AxisOpt \| null | 类目轴。data 为类目名,labelInterval 等控制刻度文字 |
| yAxis | AxisOpt \| null | 数值轴。热力图等可用 yAxis.data,同样支持标签字段 |
| series | SeriesOpt[] | 系列,至少一项 |
mkSeries() 常用字段:
| 字段 | 类型 | 默认值 | 适用 |
|---|---|---|---|
| type | string |
'line' |
图表类型,需与组件对应 |
| name | string |
'' |
系列名,Tooltip 展示 |
| data | number[] |
[] |
主数值 |
| color | string |
'' |
系列颜色 |
| names | string[] |
[] |
类目名(优先于 xAxis.data) |
折线 / 面积
| 字段 | 类型 | 说明 |
|---|---|---|
| smooth | boolean |
平滑曲线 |
| areaStyle | AreaStyleOpt |
面积填充,用 mkAreaStyle() 创建,可设 opacity |
| symbol | string |
拐点标记,'none' 隐藏 |
| symbolSize | number |
标记大小,默认 6 |
| showSymbol | boolean |
是否显示标记 |
| lineStyle | LineStyleOpt |
width / type(solid) |
| step | string |
阶梯折线,如 'start' |
import { mkOption, mkSeries, mkAreaStyle, ECOption, SeriesOpt } from '@/uni_modules/umi-charts-x'
const option = computed(() : ECOption => {
const o = mkOption()
const xa = o.xAxis
if (xa != null) {
xa.data = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] as string[]
}
const s = mkSeries()
s.data = [820, 932, 901, 934, 1290, 1330, 1320] as number[]
s.smooth = true
s.symbol = 'none'
const a = mkAreaStyle()
a.opacity = 0.35
s.areaStyle = a
o.series = [s] as SeriesOpt[]
return o
})
柱状 / 象形柱
s.type = 'bar'
s.color = '#FF7A45'
象形柱:type = 'pictorialBar',symbol 如 'diamond'。
X 轴标签
对应 ECharts xAxis.axisLabel,字段写在 xAxis 上(iOS 不能用嵌套 axisLabel 对象):
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
| labelShow | boolean |
true |
是否显示标签 |
| labelInterval | number |
0 |
0 显示全部;-1 自动抽稀;n 隔 n 个显示一个 |
| labelRotate | number |
0 |
旋转角度,-90 ~ 90。负值逆时针 |
| labelMargin | number |
8 |
文字离轴线距离 |
| labelFontSize | number |
10 |
字号 |
| labelColor | string |
'' |
颜色,空则跟随主题 |
| labelFontFamily | string |
'sans-serif' |
字体 |
| labelFontWeight | string |
'normal' |
字重,如 'bold' |
| labelAlign | string |
'' |
left / center / right,空则按旋转自动 |
| labelWidth | number |
0 |
最大宽度,配合 labelOverflow 截断 |
| labelOverflow | string |
'none' |
truncate 时按 labelWidth 截断并加省略号 |
const xa = o.xAxis
if (xa != null) {
xa.data = ['很长文字标签1', '很长文字标签2', '标签3'] as string[]
xa.labelRotate = -45
xa.labelMargin = 10
xa.labelFontSize = 10
}
饼图
类目写在 xAxis.data(或 series.names),数值写在 series.data:
s.type = 'pie'
s.data = [36, 24, 28, 12] as number[]
散点 / 气泡 / 涟漪
| 字段 | 说明 |
|---|---|
| dataX | X 数值 |
| data | Y 数值 |
| r | 气泡半径(气泡图) |
| brush | 涟漪画笔:fill / stroke |
| period / scale / waves | 涟漪周期、缩放、波数 |
s.type = 'scatter'
s.dataX = [12, 22, 28, 36, 45, 52, 61, 72] as number[]
s.data = [18, 32, 20, 44, 28, 50, 36, 58] as number[]
s.r = [10, 22, 14, 30, 18, 36, 16, 26] as number[]
涟漪散点使用 umi-effect-scatter,type = 'effectScatter'。
K 线 / 盒须
K 线:open / close / low / high,涨跌色 upColor / downColor。
盒须:boxMin / q1 / median / q3 / boxMax。
雷达 / 热力 / 仪表盘
| 图表 | 关键字段 |
|---|---|
| 雷达 | data、radarMax |
| 热力 | data 按 xAxis.data × yAxis.data 行优先展开,min / max |
| 仪表盘 | data 取第一项为当前值,min / max / name / unit |
s.type = 'gauge'
s.data = [72] as number[]
s.min = 0
s.max = 100
s.name = '完成率'
s.unit = '%'
关系 / 路径 / 树 / 桑基
| 图表 | 关键字段 |
|---|---|
| 关系图 | source / target 边索引,cats 分类,layout 默认 'force' |
| 飞线 | x0 y0 x1 y1 起终点,names,curve / period / trail |
| 树图 | parent 父节点索引(根为 -1),orient:LR / TB |
| 矩形树 / 旭日 | parent + data 数值 |
| 桑基 | source / target / data 流量 |
| 漏斗 | data 各层数值,sort 默认 'descending' |
| 平行坐标 | data 按轴数量展开,可用 option.color 区分系列 |
工具方法
从 @/uni_modules/umi-charts-x 引入:
| 方法 | 返回 | 说明 |
|---|---|---|
mkOption() |
ECOption |
创建配置(已带默认 x/y 轴和 tooltip) |
mkSeries() |
SeriesOpt |
创建系列 |
mkAreaStyle() |
AreaStyleOpt |
面积样式 |
mkLineStyle() |
LineStyleOpt |
线样式 |
mkTooltip() |
TooltipOpt |
提示框 |
mkTooltipTextStyle() |
TooltipTextStyle |
提示文字样式 |
mkAxis() |
AxisOpt |
坐标轴,可用 labelInterval 等控制刻度文字 |
注意事项
- 仅 uni-app x:页面需为
.uvue,脚本为 UTS。支持 VDOM 与 vapor(蒸汽模式)。 - 配置必须用工厂方法:UTS 不能把普通对象当成
ECOption/SeriesOpt使用。 - 组件与 type 对应:例如
umi-pie的series.type应为'pie'。 - 深色模式:设置
option.backgroundColor = '#000000'(或#000/black)。 - 关闭 Tooltip:
o.tooltip!.show = false(先判空)。 - 尺寸单位:
width/height传入纯数字时按 rpx,也可传'100%'、'400rpx'、'320px'。 - 折叠屏:组件会随窗口重绘;换尺寸参考首页折线图
line-fold-px、line-fold-resize(见上文「折叠屏 / 宽屏自适应」)。 - 不采集数据、无广告、无需额外系统权限。
隐私、权限声明
- 本插件需要申请的系统权限列表:无
- 本插件采集的数据、发送的服务器地址、以及数据用途说明:插件不采集任何数据
- 本插件是否包含广告:无

收藏人数:
购买源码授权版(
试用
使用 HBuilder 导入示例项目
赞赏(0)
下载 1476
赞赏 4
下载 12653976
赞赏 1954
赞赏
京公网安备:11010802035340号