Skip to content

NChart 图表 ​

轻量级简易图表:柱状图 / 折线图 / 饼图三种形态,一份 series 数据驱动;支持多系列、图例、坐标轴网格与刻度、数值标注、平滑曲线、环形饼图与环心文字;深浅主题文字自动换色,属性变化即时重绘,数据项可点选。

平台兼容性 ​

App(ANDROID) App(IOS) App(HARMONY) WEB 微信小程序
✓ ✓ ✓ ✓ ✓
  • 绘制通道分端:Web 端画布元素直取上下文,小程序端组件作用域选择器取节点,App 端异步上下文载体。
  • 定位为轻量级简易图表:不含动画过渡、触摸十字提示与负值之外的轴定制;复杂分析场景建议使用专业图表库。
  • 数值轴以整洁数刻度(1/2/5×10ⁿ 档位)自动取整,支持负值(0 线基准、负柱/负点向下)。

基本使用 ​

柱状图(多系列):

html
<template>
	<n-chart
		type="column"
		:categories="['一月', '二月', '三月', '四月']"
		:series="series"
	/>
</template>
<script setup lang="uts">
	import { type NChartSeriesItem } from "@/uni_modules/new-ui/components/n-chart/props";

	const series: NChartSeriesItem[] = [
		{ name: "销售额", data: [320, 410, 380, 520] },
		{ name: "成本", data: [210, 260, 240, 300], color: "#3b82f6" }
	];
</script>

折线图(平滑曲线 + 数值标注):

html
<n-chart type="line" smooth show-value :categories="week" :series="visits" />

饼图与环形(环心文字):

html
<n-chart type="pie" :radius="90" :series="sources" />
<n-chart type="pie" :radius="90" ring ring-text="流量" :series="sources" />

数据项点选(返回被点选的数据项信息):

html
<template>
	<n-chart type="column" :categories="cats" :series="series" @select="onSelect" />
</template>
<script setup lang="uts">
	import { type NChartSelectDetail } from "@/uni_modules/new-ui/components/n-chart/props";

	function onSelect(detail: NChartSelectDetail) {
		// index 类目下标 / name 系列名 / value 数值 / seriesIndex 系列下标
	}
</script>

导出图片:

html
<script setup lang="uts">
	const chartRef = ref<NChartComponentPublicInstance | null>(null);
	async function save() {
		const url = await chartRef.value!.toPng();
	}
</script>

API ​

属性 ​

属性 类型 默认值 说明
type string "column" 图表类型:"column" 柱状图 / "line" 折线图 / "pie" 饼图
categories string[] [] 类目轴标签(柱状图/折线图 X 轴),饼图忽略
series NChartSeriesItem[] [] 数据系列:柱/折线 data 为与 categories 对齐的数值数组;饼图 data 为 {name, value, color?} 数组
width number | string 300 画布宽度 px(数字)或 px/rpx 字符串
height number | string 200 画布高度 px(数字)或 px/rpx 字符串
showLegend boolean true 是否显示顶部图例
showValue boolean false 是否绘制数值标注(柱顶 / 折线数据点上方;饼图不标注)
showAxis boolean true 是否显示坐标轴、水平网格线与刻度值(柱状图/折线图)
colors string[] [] 色板覆盖:系列无 color 时按序取用,空数组时用内置色板
smooth boolean false 折线是否绘制平滑曲线
radius number 90 饼图半径 px
ring boolean false 饼图是否绘制为环形(环心透明)
centerRadius number 0 环形内径 px;0 表示自动取 0.6×radius,非环形时忽略
ringText string "" 环形中心的文字(环形时居中绘制,空串不绘制)
textColor string "" 轴/刻度/类目/图例/标注文字颜色;空串表示跟随深浅主题自动换色
customClass string "" 根节点类名(类须定义在使用方样式域)
customStyle string "" 根节点行内样式,拼接在内部默认值之后可覆盖

事件 ​

事件 参数 说明
select detail: NChartSelectDetail 数据项被点选时触发:index 类目(扇区)下标、name 系列名(扇区名)、value 数值、seriesIndex 系列下标
error message: string 数据非法(value 非有限数值)或画布通道失败时触发,不绘制

实例方法 ​

(通过 ref 直调)

方法 参数 返回 说明
toPng — Promise&lt;string> 导出当前图表为 png dataURL;未绘制成功时返回空串

数据非法行为 ​

  • 系列为空或全部 data 为空数组:清空画布,不报错(未配置状态)。
  • value 非有限数值(NaN / Infinity):发 error,不绘制。
  • 饼图 value≤0 的项不绘制扇区(图例仍列出);全部 ≤0 时空画布。

实现说明(参考做法 vs 本库做法) ​

指定参考源(柱/折/饼三件)在本地与互联网全渠道核实为加密壳化发行(源码空壳、演示页占位、公开文档无此分类),可核实的只有饼图壳内残留与组件定位自述。本组件按残留依据 + 图表领域通用语义(uni 生态通行图表库的稳定约定)保守自研,逐项对照如下;无法核实项如实标注。

机制 参考做法 本库做法 分歧理由
组件形态 三件独立组件(柱/折/饼各一) 单组件 type 三形态 队列为单组件;数据面与绘制基建高度同构,单组件收敛降低接入成本(同 n-barcode 多码型收敛先例)
饼图数据项 壳内 dataset 每项含 color 与角度(数据入口已壳化不可见) series[0].data = {name, value}[],色由系列色板分配 数据结构取行业通用形态
饼图实现 view 扇区旋转 + clip 裁剪拼合(非 canvas) canvas 弧路径直接绘制,环形用外弧+内弧反向路径填充 残留实现中心圆需背景盖板色(background 应与页面背景一致,深浅主题下失真);弧路径环心天然透明,删去盖板色 prop
饼图尺寸 radius(rpx 200)/ centerRadius(rpx 120) radius(px 90)/ centerRadius(px,0 = 自动 0.6×radius) 尺寸语义统一画布族约定(数字 = px);默认值换算为等效 px;0.6 比例为残留默认的等效关系
环心文字 残留无 ringText 环形图环心信息位为通用形态,低成本低风险收录
数据项点击 壳内扇区绑定 itemClick(index) select 事件,参数 {index, name, value, seriesIndex};柱/折线同享(带区间 / 最近点 ≤12px 命中) 事件名全小写(小程序端事件名兼容惯例);参数结构化三形态一致;命中几何与绘制共用同一布局函数
类目轴 + 系列 不可核实 categories + series({name, data, color}) 行业通用数据形态(通行图表库同构)
刻度取整 不可核实 整洁数步长(1/2/5×10ⁿ),4 条网格线,0 线加重 刻度标注可整除不留长尾小数,通行做法
负值 不可核实 支持(vMin < 0 时 0 线偏移,负柱向下) 数据轴 0 基准的自然延伸
图例 / 数值标注 不可核实 showLegend / showValue 开关 行业通用开关语义(legend / dataLabel)
平滑曲线 不可核实 smooth(相邻中点二次贝塞尔) 行业通用形态
色板 dataset 每项带 color 系列可显式 color;缺省按 colors 色板或内置 8 色按序分配 显式色优先 + 自动色板兜底
主题适配 不可核实 textColor 空 = 深浅主题自动(isDark watch 重绘),显式传值覆盖 库主题系统一致体验(同水印深浅换色机制)
动画 / 触摸提示 不可核实 不收录 定位为轻量级简易图表;参考源残留亦无动画痕迹;复杂场景建议专业图表库
导出 不可核实 toPng png dataURL 库内画布组件(二维码/条码)一致能力,海报合成等场景依赖
错误暴露 不可核实 error 事件(数据非法 / 画布通道失败显式暴露) 静默失败违背库内画布组件一致性
响应式 不可核实(残留 setRadius 空函数,疑似手动重绘入口) 全 props 指纹 watch 自动重绘 手动重绘入口在属性驱动的声明式用法下多余(同条码收敛决策)

记录 · 思考 · 创作