注意:以下翻译的准确性尚未经过验证。这是使用 AIP ↗ 从原始英文文本进行的机器翻译。
如果 Chart XY 微件无法实现所需的功能或格式,请考虑使用 Vega Chart 微件。
Chart XY 微件用于将 Objects 可视化为交互式图表。模块搭建者配置 Chart XY 微件可以:
下面的截图显示了三个配置的 Chart XY 微件显示 Flight Alerts
数据的示例:
在下图中,蓝色箭头左侧可以看到一个新添加(但尚未配置)的 Chart XY 微件及其初始配置面板。蓝色箭头右侧可以看到一个单独的 Layer 配置面板,其中已填充 Flight Alerts
的支持对象集:
配置图层是向 Chart XY 微件添加数据的必要步骤。图层的配置选项如下:
除了上述图层的配置选项外,主要的 Chart XY 配置面板还包含许多图表范围的配置选项:
配置 Function 支持的图层需要编写一个函数,该函数返回 TwoDimensionalAggregation
或 ThreeDimensionalAggregation
。
下面是一个完整示例,该示例返回 TwoDimensionalAggregation
以便将一个时间序列除以另一个时间序列进行图表展示:
Copied!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
import { Function, TwoDimensionalAggregation, ThreeDimensionalAggregation, IRange, Timestamp } from "@foundry/functions-api"; import { ObjectSet, MyObjectType } from "@foundry/ontology-api" // 定义一个类,用于时间序列的聚合操作 export class TimeseriesAggregations { @Function() // 定义一个异步函数,计算对象集合中的每个对象在总和中的百分比 public async percentOfTotal(objects:ObjectSet<MyObjectType>): Promise<TwoDimensionalAggregation<IRange<Timestamp>>> { // 按天对对象进行分组,并计算每组的值之和,得到分子 const numerators = await objects.groupBy(e => e.date.byDays()) .sum(e => e.value); // 按天对对象进行分组,并计算每组的总和,得到分母 const denominators = await objects.groupBy(e => e.date.byDays()) .sum(e => e.total); // 调用divide方法计算百分比 return this.divide(numerators, denominators); } // 私有方法,用于计算百分比 private divide(numerators:TwoDimensionalAggregation<IRange<Timestamp>>, denominators: TwoDimensionalAggregation<IRange<Timestamp>>): TwoDimensionalAggregation<IRange<Timestamp>> { // 计算每个时间段的百分比 const percentage = numerators.buckets.map((bucket, i) => { const numerator = bucket.value; const denominator = denominators.buckets[i].value; if (denominator == 0) { // 如果分母为0,避免除以0错误 return { key: bucket.key, value: 0 }; } return { key: bucket.key, value: numerator / denominator } }); return { buckets: percentage }; } }
以下是一个完整的示例,它返回一个ThreeDimensionalAggregation
,将为segmentBy()
返回的每个值绘制一个单独的系列:
Copied!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
import { Function, TwoDimensionalAggregation, ThreeDimensionalAggregation, IRange, Timestamp } from "@foundry/functions-api"; import { ObjectSet, MyObjectType } from "@foundry/ontology-api" export class TimeseriesAggregations { @Function() public async percentOfTotalSegmented(objects:ObjectSet<MyObjectType>): Promise<ThreeDimensionalAggregation<IRange<Timestamp>, string>> { // 计算分子:对对象按日期分组,再按groupId进行细分,最后计算value的和 const numerators = await objects.groupBy(e => e.date.byDays()) .segmentBy(e => e.groupId.topValues()) .sum(e => e.value); // 计算分母:与分子类似,只不过这里计算的是total的和 const denominators = await objects.groupBy(e => e.date.byDays()) .segmentBy(e => e.groupId.topValues()) .sum(e => e.total); // 调用divideThreeDimensional方法计算百分比 return this.divideThreeDimensional(numerators, denominators); } private divideThreeDimensional(numerators:ThreeDimensionalAggregation<IRange<Timestamp>, string>, denominators: ThreeDimensionalAggregation<IRange<Timestamp>, string>): ThreeDimensionalAggregation<IRange<Timestamp>, string> { var percentage = numerators.buckets; // 拷贝分子数据 for (let i = 0; i < numerators.buckets.length; i++) { for (let j = 0; j < numerators.buckets[i].value.length; j++) { // 计算每个分段的百分比:分子/分母 percentage[i].value[j].value = numerators.buckets[i].value[j].value / denominators.buckets[i].value[j].value; } } // 返回计算出的百分比结果 return { buckets: percentage }; } }