차트 XY 위젯은 오브젝트를 대화식 차트로 시각화하는 데 사용됩니다. 모듈 빌더는 차트 XY 위젯을 구성할 때 다음을 수행할 수 있습니다.
아래 스크린샷은 Flight Alerts
데이터를 표시하는 세 개의 구성된 차트 XY 위젯 예제를 보여줍니다:
아래 이미지에서 파란색 화살표 왼쪽에는 새로 추가된(아직 구성되지 않은) 차트 XY 위젯과 초기 구성 패널이 표시됩니다. 파란색 화살표 오른쪽에는 백킹 오브젝트 세트 Flight Alerts
가 이미 채워진 개별 레이어 구성 패널이 표시됩니다:
레이어를 구성하여 차트 XY 위젯에 데이터를 추가하는 것이 필요합니다. 레이어에 대한 다음 구성 옵션을 사용할 수 있습니다.
위에서 설명한 레이어의 구성 옵션 외에도 주요 차트 XY 구성 패널에는 여러 차트 전체 구성 옵션이 포함됩니다:
Function-backed 레이어를 구성하려면 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 41 42 43
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); // 분자와 분모를 나누어 결과를 반환 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; // 분모가 0인 경우 0으로 처리 if (denominator == 0) { return { key: bucket.key, value: 0 }; } // 분자를 분모로 나눈 값을 반환 return { key: bucket.key, value: numerator / denominator } }); // 백분율 결과 반환 return { buckets: percentage }; } }
다음은 segmentBy()
에서 반환하는 각 값에 대해 별도의 시리즈를 차트로 그리는 ThreeDimensionalAggregation
을 반환하는 전체 예제입니다:
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
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>> { const numerators = await objects.groupBy(e => e.date.byDays()) .segmentBy(e => e.groupId.topValues()) .sum(e => e.value); const denominators = await objects.groupBy(e => e.date.byDays()) .segmentBy(e => e.groupId.topValues()) .sum(e => e.total); return this.divideThreeDimensional(numerators, denominators); } // 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 }; } }
더 많은 예제를 보려면 오브젝트 세트 집계 및 커스텀 집계 생성하기에 관한 Functions 관련 문서를 참조하세요.