更新记录

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

安装

  1. 从 DCloud 插件市场 导入本插件到项目 uni_modules/umi-charts-x
  2. 组件符合 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 等控制刻度文字

注意事项

  1. 仅 uni-app x:页面需为 .uvue,脚本为 UTS。支持 VDOM 与 vapor(蒸汽模式)。
  2. 配置必须用工厂方法:UTS 不能把普通对象当成 ECOption / SeriesOpt 使用。
  3. 组件与 type 对应:例如 umi-pie 的 series.type 应为 'pie'。
  4. 深色模式:设置 option.backgroundColor = '#000000'(或 #000 / black)。
  5. 关闭 Tooltip:o.tooltip!.show = false(先判空)。
  6. 尺寸单位:width / height 传入纯数字时按 rpx,也可传 '100%'、'400rpx'、'320px'。
  7. 折叠屏:组件会随窗口重绘;换尺寸参考首页折线图 line-fold-px、line-fold-resize(见上文「折叠屏 / 宽屏自适应」)。
  8. 不采集数据、无广告、无需额外系统权限。

隐私、权限声明

  1. 本插件需要申请的系统权限列表:无
  2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:插件不采集任何数据
  3. 本插件是否包含广告:无

隐私、权限声明

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

无

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

插件不采集任何数据

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

无