APEX图表中增加参考线平均值

适用版本

  1. [[Oracle APEX19.2]]
  2. Oracle JET 7.2

背景

项目初始计划采用Power BI进行图表展示,但鉴于所需指标相对简单,最终决定直接在应用内部实现。图表的样式如下所示:

问题

尽管柱状图的设计相对简易,但在添加平均值横线时遇到了挑战。虽然通过组合图(柱状图与折线图)可以达到类似效果,但考虑到需要编写额外的SQL查询,我选择了寻找更为简便的方法。于是,在“Sample Charts”应用中探寻解决方案,并发现了一个名为“Line Chart (Reference Object via JavaScript Customizations)”的例子,其功能似乎符合需求。

OsXM1-2025-11-19-14-00-03

实施步骤

  1. 参考代码并加以调整:首先参阅了Oracle JET的相关文档1。尽管Oracle APEX 19.2自带的是JET 7.2版本,这在当前已显得颇为陈旧,以至于在官方网站上难以找到对应版本的详细说明。幸运的是,APEX的帮助文档中提供了链接指引。以下为调整后的JavaScript代码片段: OsXM1-2025-11-19-14-08-15
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
function( options ) {
var avgValue = parseFloat("&P222_AVG.");
    // 设置一个在检索数据时调用的回调函数, 此函数可用于操纵系列
    options.dataFilter = function (data) {
        data.series[0].color = "rgb(21, 159, 237)";
        return data;
    };
    // Define Reference Object line on Y Axis of chart
    var constantLineY = [ {
        text:"平均"+ (avgValue* 100)+'%' , type: "line", value: avgValue, color: "rgb(252, 220, 115)",
         displayInLegend: "on", lineWidth: 3, location: "back", lineStyle: "solid", shortDesc: "平均"+ (avgValue* 100)+'%' }];
    options.yAxis.referenceObjects = constantLineY;
    return options;
}
  1. 最终成果展示:经过上述调整后,成功实现了预期效果。图表不仅保留了原有的简洁性,还增加了直观反映平均值的水平线,从而提升了数据分析的直观性和易读性。 OsXM1-2025-11-19-14-10-40

另外的方案

  1. 带有悬浮窗版本
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
function(options) {
    var avgValue = parseFloat("&P222_AVG."); // 从页面项获取平均值
    options.dataFilter = function(data) {
        // 设置原始系列颜色
        data.series[0].color = "rgb(21, 159, 237)";
        // 创建与原始数据等长的平均值数组
        var itemCount = data.series[0].items.length;
        var avgArray = Array(itemCount).fill(avgValue);
        // 添加平均线 series
        data.series.push({
            name: "平均"+(avgValue*100)+'%',
            items: avgArray,
            type: "line",
            color: "rgb(252, 220, 115)",
            lineWidth: 4,
            lineStyle: "solid",
            markerDisplayed: "off"  // 关闭标记点,视觉更干净
        });
        return data;
    };
    // 全局样式:启用数据标签,并通过 renderer 精准控制
    options.styleDefaults = {
        dataLabel: {
            display: "on",                    // 开启标签显示
            textType: "value",                // 显示实际数值
            hAlign: "center",                 // 水平居中
            vAlign: "above",                  // 显示在上方
            tickLabel: {
                show: true,
                position: 'end',  // 可选 'insideTop', 'outside' 等
                rendered:  'on',
                    },
            style: {
                fill: "rgb(252, 220, 115)",   // 标签颜色
                "font-weight": "bold",
                "font-size": "12px"
            },
            renderer: function(context) {
                // 仅对最后一个 series(即平均线)显示标签
                if (context.seriesIndex === context.componentOptions.series.length - 1) {
                    return avgValue.toFixed(2); // 显示固定两位小数的平均值   
                }
                return null; // 其他系列不显示标签
            }
        }
    };
    // 必须使用 combo 类型以混合 bar 和 line
    options.type = "combo";
    return options;
}
  1. 利用折线图

其他

  1. 对于平均值的刷新问题.

  2. 平均值直接显示问题.

Licensed under CC BY-NC-SA 4.0
最后更新于 2025-12-03 15:45
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计