Reputation: 11
I am using antv basic Column chart in React app. I am trying to display dates on X axis. All the dates are formatted to DD.MM.YYYY and inputed to chart as string. For some reason It is never sorted correctly.
Please, does anyone encountered this behaviour? Is it somehow possible to add sort method in chart config? I couldn't find anything in documentation.
Data loading method:
const [data, setData] = useState<any>(undefined);
const loadValues = useCallback(
(data) => {
const array = []
for (const [day, values] of Object.entries(data)) {
for (const [type, value] of Object.entries(values as any)) {
array.push({
date: moment(day).format('L');,
value: value
});
}
}
setData(array)
}, []
)
Column graph:
<Column
data=data
isGroup={true}
xField="date"
yField="value"
isStack={true}
legend={{
layout: 'horizontal' as const,
position: 'bottom' as const,
}}
/>
Thank you for any information.
EDIT:
I have solved it with data initialization for selected dates.
Initialization function:
const initializeDays = (from: moment.Moment, to: moment.Moment, data: any) => {
let dateToAdd = from;
let array: {date: string, value: number}[] = [];
const dayAfterTo = moment(to).add(1, 'day').format('L');
while (moment(dateToAdd).format('L') !== dayAfterTo) {
for (const [day] of Object.entries(data)) {
if (moment(dateToAdd).format('L') === moment(day).format('L')) {
array.push({
date: moment(dateToAdd).format('L'),
value: 0
})
}
}
dateToAdd.add(1, 'day')
}
return array;
}
Updated data loading method:
const loadValues = useCallback(
(data) => {
const array = initializeDays(from, to, data)
for (const [day, values] of Object.entries(data)) {
for (const [type, value] of Object.entries(values as any)) {
array.forEach((item) => {
if (item.date === moment(day).format('L')) {
item.value: value;
}
})
}
}
setData(array)
}, []
)
Upvotes: 1
Views: 921