在amCharts 5的实际使用场景中,我们经常会拿到后端返回的结构化数据对象,这类数据通常包含多个字段,需要从中提取特定值来渲染图表,不需要额外做复杂的数据扁平化处理,amCharts 5本身就支持直接解析这类数据。

基础结构化数据适配
假设我们有一个存储销售数据的结构化对象数组,每个对象包含时间、产品类别、销售额三个字段,我们需要用这些数据渲染一个柱状图,展示不同类别的销售额。首先看原始数据结构:
// 结构化数据对象数组
const salesData = [
{ time: "2024-01", category: "电子产品", amount: 12000 },
{ time: "2024-01", category: "家居用品", amount: 8500 },
{ time: "2024-02", category: "电子产品", amount: 15000 },
{ time: "2024-02", category: "家居用品", amount: 9200 }
];
在amCharts 5中,我们可以直接将这个数组作为图表的数据源,通过配置系列的dataFields属性来映射对应的字段:
import * as am5 from "@amcharts/amcharts5";
import * as am5xy from "@amcharts/amcharts5/xy";
// 创建根容器
const root = am5.Root.new("chartdiv");
// 创建XY图表
const chart = root.container.children.push(
am5xy.XYChart.new(root, {
panX: false,
panY: false,
wheelX: "panX",
wheelY: "zoomX",
layout: root.verticalLayout
})
);
// 创建X轴,对应time字段
const xAxis = chart.xAxes.push(
am5xy.CategoryAxis.new(root, {
categoryField: "time",
renderer: am5xy.AxisRendererX.new(root, {})
})
);
xAxis.data.setAll(salesData);
// 创建Y轴,对应数值轴
const yAxis = chart.yAxes.push(
am5xy.ValueAxis.new(root, {
renderer: am5xy.AxisRendererY.new(root, {})
})
);
// 创建柱状图系列,映射category和amount字段
const series = chart.series.push(
am5xy.ColumnSeries.new(root, {
name: "销售额",
xAxis: xAxis,
yAxis: yAxis,
valueYField: "amount",
categoryXField: "category"
})
);
// 直接设置结构化数据
series.data.setAll(salesData);
嵌套结构化数据提取
如果结构化数据存在嵌套层级,比如数据对象中包含子对象,amCharts 5也支持通过字段路径来提取对应的值。例如数据结构如下:
const nestedData = [
{
month: "2024-01",
sales: { electronic: 12000, furniture: 8500 },
total: 20500
},
{
month: "2024-02",
sales: { electronic: 15000, furniture: 9200 },
total: 24200
}
];
要提取sales.electronic的值作为系列数据,只需要在配置valueYField时使用点路径即可:
const electronicSeries = chart.series.push(
am5xy.LineSeries.new(root, {
name: "电子产品销售额",
xAxis: xAxis,
yAxis: yAxis,
// 使用点路径提取嵌套字段值
valueYField: "sales.electronic",
categoryXField: "month"
})
);
electronicSeries.data.setAll(nestedData);
动态更新结构化数据
当结构化数据对象发生更新时,我们不需要重新创建整个图表,只需要更新对应系列的数据即可。amCharts 5的数据系统会自动检测变化并重新渲染:
// 模拟数据更新,新增一条数据
const newDataItem = { time: "2024-03", category: "电子产品", amount: 18000 };
salesData.push(newDataItem);
// 更新X轴数据
xAxis.data.setAll(salesData);
// 更新系列数据
series.data.setAll(salesData);
注意事项
- 如果结构化数据中的字段名包含特殊字符或者空格,需要在字段路径中使用方括号包裹,例如
valueYField: "['sales amount']" - 当数据结构不一致时,建议先对数据做简单的校验和补全,避免出现字段缺失导致的渲染错误
- 如果数据量过大,建议使用
data.processor配置数据处理器,在设置数据前做统一的格式转换,提升处理效率
amCharts 5的数据适配能力非常灵活,大部分结构化数据场景都可以直接通过字段映射完成,不需要额外做大量的数据预处理工作,能够大幅降低图表开发的复杂度。
amCharts_5结构化数据数据可视化图表配置修改时间:2026-07-21 14:21:25