Skip to content

Commit

Permalink
fix(web): sort line chart data according to time order (#1639)
Browse files Browse the repository at this point in the history
  • Loading branch information
chenluli authored Jun 17, 2024
1 parent e1e94f9 commit 49b56b4
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 21 deletions.
14 changes: 7 additions & 7 deletions web/components/chart/autoChart/advisor/pipeline.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,8 @@ export const getVisAdvices = (props: { data: Datum[]; myChartAdvisor: Advisor; d
*/
const customDataProps = dataMetaMap
? Object.keys(dataMetaMap).map((item) => {
return { name: item, ...dataMetaMap[item] };
})
return { name: item, ...dataMetaMap[item] };
})
: null;

// 可根据需要选择是否使用全部 fields 进行推荐
Expand All @@ -84,11 +84,11 @@ export const getVisAdvices = (props: { data: Datum[]; myChartAdvisor: Advisor; d
const selectedFields =
size(allFieldsInfo) > 2
? allFieldsInfo?.filter((field) => {
if (field.recommendation === 'string' || field.recommendation === 'date') {
return field.distinct && field.distinct > 1;
}
return true;
})
if (field.recommendation === 'string' || field.recommendation === 'date') {
return field.distinct && field.distinct > 1;
}
return true;
})
: allFieldsInfo;

const allAdvices = myChartAdvisor?.adviseWithLog({
Expand Down
9 changes: 5 additions & 4 deletions web/components/chart/autoChart/charts/multi-line-chart.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { hasSubset, intersects } from '../advisor/utils';
import { findOrdinalField, processDateEncode, findNominalField, isUniqueXValue, getLineSize } from './util';
import { hasSubset } from '../advisor/utils';
import { findOrdinalField, processDateEncode, findNominalField, getLineSize, sortData } from './util';
import type { ChartKnowledge, CustomChart, GetChartConfigProps, Specification } from '../types';
import type { Datum } from '@antv/ava';

const MULTI_LINE_CHART = 'multi_line_chart'
const getChartSpec = (data: GetChartConfigProps['data'], dataProps: GetChartConfigProps['dataProps']) => {
const ordinalField = findOrdinalField(dataProps);
const nominalField = findNominalField(dataProps);
Expand All @@ -18,7 +19,7 @@ const getChartSpec = (data: GetChartConfigProps['data'], dataProps: GetChartConf
const spec: Specification = {
type: 'view',
autoFit: true,
data,
data: sortData({ data, chartType: MULTI_LINE_CHART, xField: field4X }),
children: [],
};

Expand All @@ -43,7 +44,7 @@ const getChartSpec = (data: GetChartConfigProps['data'], dataProps: GetChartConf
};

const ckb: ChartKnowledge = {
id: 'multi_line_chart',
id: MULTI_LINE_CHART,
name: 'multi_line_chart',
alias: ['multi_line_chart'],
family: ['LineCharts'],
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { hasSubset } from '../advisor/utils';
import { findNominalField, findOrdinalField, getLineSize, processDateEncode } from './util';
import { findNominalField, findOrdinalField, getLineSize, processDateEncode, sortData } from './util';
import type { ChartKnowledge, CustomChart, GetChartConfigProps, Specification } from '../types';
import { Datum } from '@antv/ava';

const MULTI_MEASURE_LINE_CHART = 'multi_measure_line_chart'
const getChartSpec = (data: GetChartConfigProps['data'], dataProps: GetChartConfigProps['dataProps']) => {
try {
// @ts-ignore
Expand All @@ -12,7 +13,7 @@ const getChartSpec = (data: GetChartConfigProps['data'], dataProps: GetChartConf

const spec: Specification = {
type: 'view',
data,
data: sortData({ data, chartType: MULTI_MEASURE_LINE_CHART, xField: field4Nominal }),
children: [],
};

Expand Down Expand Up @@ -40,7 +41,7 @@ const getChartSpec = (data: GetChartConfigProps['data'], dataProps: GetChartConf
};

const ckb: ChartKnowledge = {
id: 'multi_measure_line_chart',
id: MULTI_MEASURE_LINE_CHART,
name: 'multi_measure_line_chart',
alias: ['multi_measure_line_chart'],
family: ['LineCharts'],
Expand Down
28 changes: 22 additions & 6 deletions web/components/chart/autoChart/charts/util.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
import { Datum, FieldInfo } from '@antv/ava';
import { hasSubset, intersects } from '../advisor/utils';
import { uniq } from 'lodash';

type BasicDataPropertyForAdvice = any;
import type { Datum, FieldInfo } from "@antv/ava";
import { hasSubset, intersects } from "../advisor/utils";
import { cloneDeep, uniq } from "lodash";

/**
* Process date column to new Date().
* @param field
* @param dataProps
* @returns
*/
export function processDateEncode(field: string, dataProps: BasicDataPropertyForAdvice[]) {
export function processDateEncode(field: string, dataProps: FieldInfo[]) {
const dp = dataProps.find((dataProp) => dataProp.name === field);

if (dp?.recommendation === 'date') {
Expand Down Expand Up @@ -50,3 +48,21 @@ export const getLineSize = (
}
return field4X?.name && isUniqueXValue({ data: allData, xField: field4X.name }) ? 5 : undefined;
};

export const sortData = ({ data, chartType, xField }: {
data: Datum[];
xField?: FieldInfo;
chartType: string;
}) => {
const sortedData = cloneDeep(data)
try {
// 折线图绘制需要将数据点按照日期从小到大的顺序排序和连线
if (chartType.includes('line') && xField?.name && xField.recommendation === 'date') {
sortedData.sort((datum1, datum2) => new Date(datum1[xField.name as string]).getTime() - new Date(datum2[xField.name as string]).getTime())
return sortedData
}
} catch (err) {
console.error(err)
}
return sortedData
}
10 changes: 9 additions & 1 deletion web/components/chart/autoChart/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { AutoChartProps, ChartType, CustomAdvisorConfig, CustomChart, Specificat
import { customCharts } from './charts';
import { ChatContext } from '@/app/chat-context';
import { compact, concat, uniq } from 'lodash';
import { sortData } from './charts/util';

const { Option } = Select;

Expand Down Expand Up @@ -81,14 +82,21 @@ export const AutoChart = (props: AutoChartProps) => {
setAdvices(allAdvices);
setRenderChartType(allAdvices[0]?.type as ChartType);
}
}, [data, advisor, chartType]);
}, [JSON.stringify(data), advisor, chartType]);

const visComponent = useMemo(() => {
/* Advices exist, render the chart. */
if (advices?.length > 0) {
const chartTypeInput = renderChartType ?? advices[0].type;
const spec: Specification = advices?.find((item: Advice) => item.type === chartTypeInput)?.spec ?? undefined;
if (spec) {
if (spec.data && ['line_chart', 'step_line_chart'].includes(chartTypeInput)) {
// 处理 ava 内置折线图的排序问题
const dataAnalyzerOutput = advisor?.dataAnalyzer.execute({ data })
if (dataAnalyzerOutput && 'dataProps' in dataAnalyzerOutput) {
spec.data = sortData({ data: spec.data, xField: dataAnalyzerOutput.dataProps?.find(field => field.recommendation === 'date'), chartType: chartTypeInput });
}
}
return (
<Chart
key={chartTypeInput}
Expand Down

0 comments on commit 49b56b4

Please sign in to comment.