ECharts图表参数配置与SQL查询数据联动 - 第4节
4.1 饼图(Pie Chart)核心参数与数据映射
饼图用于展示部分与整体的比例关系,每个扇区代表一个数据维度在总量中的占比。ECharts 的饼图支持环形图、南丁格尔玫瑰图等变体,核心参数集中在 series 的 type: 'pie' 中。
4.1.1 基础参数配置表
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
radius |
string | Array | ['0%', '75%'] |
饼图半径。单值如 '60%' 为实心饼;数组如 ['40%', '70%'] 为环形图(内径、外径) |
center |
Array | ['50%', '50%'] |
饼图中心位置,相对于容器 |
roseType |
boolean | string | false |
是否启用南丁格尔玫瑰图。'radius' 按数值分配半径,'area' 按面积分配 |
selectedMode |
string | false |
选中模式:'single' 单选,'multiple' 多选 |
label.formatter |
string | Function | '{b}: {d}%' |
标签格式化模板,{b} 名称,{c} 数值,{d} 百分比 |
emphasis.scaleSize |
number | 10 |
高亮时扇区向外偏移的像素距离 |
实战提示:当数据项超过 6 项时,建议将小比例数据合并为“其他”分类,或使用
label.position: 'outside' 配合引导线避免标签重叠。
4.1.2 饼图数据映射与 SQL 联动
饼图的数据结构为 [{ name: '分类', value: 数值 }]。以下 SQL 查询按产品类别统计销售额占比:
-- 按产品类别统计销售额占比
SELECT
category_name AS name,
SUM(sales_amount) AS value
FROM orders
JOIN products ON orders.product_id = products.id
WHERE order_date BETWEEN '2024-01-01' AND '2024-12-31'
GROUP BY category_name
ORDER BY value DESC;
前端接收 JSON 后直接赋值给 series[0].data,无需二次转换。
4.1.3 饼图参数配置示例
option = {
tooltip: { trigger: 'item', formatter: '{b}: {c} ({d}%)' },
legend: { bottom: '5%' },
series: [{
type: 'pie',
radius: ['40%', '70%'], // 环形图
center: ['50%', '50%'],
roseType: 'radius', // 玫瑰图效果
selectedMode: 'single',
label: { formatter: '{b}\n{d}%' },
emphasis: { scaleSize: 12 },
data: [
{ name: '电子产品', value: 2850 },
{ name: '服装', value: 1920 },
{ name: '食品', value: 1580 },
{ name: '家居', value: 1240 },
{ name: '其他', value: 680 }
]
}]
};
关键参数联动:
radius 数组的第一个值控制内径大小,内径越大越接近环形图;roseType: 'radius' 会使扇区半径与数值成正比,视觉上放大差异。
4.2 散点图(Scatter Chart)核心参数与数据映射
散点图用于展示两个连续变量之间的分布关系,每个点代表一条数据记录。ECharts 支持气泡图(通过 symbolSize 映射第三个维度)和带有回归趋势线的散点图。
4.2.1 基础参数配置表
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
symbol |
string | 'circle' |
散点形状:'circle'、'rect'、'diamond'、'triangle' 等 |
symbolSize |
number | Function | 10 |
散点大小。函数形式可映射第三个维度:function(value) { return value[2] / 10; } |
large |
boolean | false |
是否开启大数据量优化(≥5000 点建议开启) |
largeThreshold |
number | 2000 |
触发大数据量优化的阈值 |
scaleLimit |
Object | { min: 1, max: 1 } |
散点缩放范围限制,防止过小或过大 |
itemStyle.opacity |
number | 0.8 |
散点透明度,大量重叠时建议降低到 0.3~0.5 |
4.2.2 散点图数据映射与 SQL 联动
散点图的数据结构为 [[x1, y1], [x2, y2], ...] 或 [{ value: [x, y] }]。以下 SQL 查询用户年龄与消费金额的关系:
-- 查询用户年龄与消费金额的散点数据
SELECT
u.age AS x,
SUM(o.amount) AS y
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.order_date >= '2024-01-01'
GROUP BY u.id, u.age
HAVING SUM(o.amount) > 0
ORDER BY u.age;
前端将结果映射为 [age, totalAmount] 数组,赋值给 series[0].data。
4.2.3 散点图参数配置示例(含气泡图)
option = {
tooltip: { trigger: 'item', formatter: '年龄: {c0} 岁\n消费: ¥{c1}' },
xAxis: { type: 'value', name: '年龄(岁)' },
yAxis: { type: 'value', name: '消费金额(元)' },
series: [{
type: 'scatter',
symbol: 'circle',
symbolSize: function(value) {
// 第三个维度:消费频次,映射为气泡大小
return Math.max(5, value[2] / 5);
},
itemStyle: { opacity: 0.6 },
large: true,
largeThreshold: 3000,
data: [
[25, 3200, 12], // [年龄, 消费金额, 消费频次]
[30, 4800, 18],
[35, 5600, 22],
[40, 6200, 25],
[45, 5100, 20],
[50, 4300, 15],
[55, 3800, 10],
[60, 2900, 8]
]
}]
};
常见陷阱:散点图数据量较大时(>5000 点),务必设置
large: true 并调整 largeThreshold,否则浏览器渲染会卡顿甚至崩溃。同时建议降低 itemStyle.opacity 到 0.3~0.5 以显示重叠区域密度。
4.3 饼图与散点图的参数对比
| 对比维度 | 饼图 | 散点图 |
|---|---|---|
| 适用场景 | 部分与整体的比例关系 | 两个连续变量的分布与相关性 |
| 数据维度 | 1 个分类 + 1 个数值 | 2 个连续变量(气泡图可加第 3 维) |
| 核心参数 | radius、roseType、selectedMode |
symbolSize、large、itemStyle.opacity |
| 数据量建议 | ≤ 6 项分类,过多需合并 | 几百到几万点均可,需开启 large |
| SQL 输出格式 | [{name, value}] |
[[x, y]] 或 [[x, y, z]] |
| 交互特性 | 扇区选中、高亮偏移 | 数据点悬浮提示、框选缩放 |
选型建议:当需要展示“占比”时优先使用饼图或环形图;当需要探索变量间的关系(如年龄与消费、广告投入与转化率)时,散点图是首选。若数据点超过 10000,建议使用
type: 'scatter' 配合 large: true,或考虑使用 type: 'heatmap' 作为替代。
4.4 常见问题与避坑指南
- 饼图标签重叠:当扇区较小时,标签会相互遮挡。解决方案:设置
label.avoidLabelOverlap: true,或使用label.position: 'outside'配合引导线。 - 散点图数据点过多导致卡顿:务必开启
large: true,并设置largeThreshold为 2000~5000。同时降低itemStyle.opacity到 0.3~0.5。 - 饼图数据项过多:超过 8 项时,将小比例项(如 < 3%)合并为“其他”,并在 tooltip 中显示详细数据。
- 散点图坐标轴范围不当:使用
xAxis.min和xAxis.max手动设置范围,避免离群点拉伸坐标轴导致主体数据聚集。 - SQL 返回空值:饼图和散点图都不接受
null或undefined值,SQL 中需使用COALESCE或HAVING过滤无效数据。
性能优化建议:对于散点图,如果数据量超过 10 万点,建议在 SQL 层进行采样(如
TABLESAMPLE 或 ORDER BY RANDOM() LIMIT 10000),或使用 ECharts 的 type: 'scatter' 配合 large: true 和 largeThreshold: 5000。