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' 会使扇区半径与数值成正比,视觉上放大差异。
饼图核心结构示意 35% 25% 20% 12% 8% 参数配置要点 • radius: ['40%','70%'] • roseType: 'radius' • selectedMode: 'single' • label.formatter: '{b}: {d}%' • emphasis.scaleSize: 12 • 数据项 ≤ 6 项最佳 • 小项合并为“其他”

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 以显示重叠区域密度。
散点图(气泡图)结构示意 20 30 40 50 60 年龄(岁) 0 2000 4000 6000 8000 消费金额(元) 气泡图映射规则 • X 轴:年龄(连续变量) • Y 轴:消费金额(连续变量) • 气泡大小:消费频次(第三维度)

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。