-
Notifications
You must be signed in to change notification settings - Fork 12k
Description
Splitting off this discussion from #6576 where it started.
A few goals:
- Be able to skip parsing if the user passes in data in the desired format. E.g. if the user passes in data as numbers (not
string
ormoment
) then we should be able to use that data directly. This currently takes about 7% of the time on the uPlot benchmark, but should be able to be skipped - Make
determineDataLimits
(andgetAllTimestamps
for the time scale) faster on the x axis. We should just be able to look at the first and last data point. Right now we have to spend substantial time going through each data point of each data series looking for themin
andmax
. This currently takes about 20% of the time on the uPlot benchmark, but should be instantaneous
We could use an array of objects. This option is a bit more self-describing and better handles sparse inputs.
data: [
{x: 1572981786, y1: 12, y2: 33, o: 23.04, h: 24.01, l: 22.08, c: 23.01},
{x: 1572591743, y1: 33, y2: 22, o: 23.04, h: 24.01, l: 22.08, c: 23.01},
{x: 1572161732, y1: 11, y2: 11, o: 23.04, h: 24.01, l: 22.08, c: 23.01}
],
series: [
{
type: 'line',
label: 'foo',
data: { y: 'y1' },
order: 10
},
{
type: 'bar',
label: 'bar',
data: { y: 'y2' },
order: 5
},
{
type: 'financial', // not specifying data here because using the controller default names
label: 'voo',
order: 3
}
],
scales: {
x: {
type: 'time',
parser: 'YYYY-MM-DD'
},
y: {
type: 'linear'
}
}
Or an array of arrays. This option would be smaller data transfer over the wire. It also would avoid the user having to care about names (e.g. keeping track of an incrementer to create 'y1'
, 'y2'
, etc. and possibly parsing them back out)
data: [
[1572981786, 12, 33, 23.04, 24.01, 22.08, 23.01],
[1572591743, 33, 22, 23.04, 24.01, 22.08, 23.01],
[1572161732, 11, 11, 23.04, 24.01, 22.08, 23.01]
],
series: [
{
type: 'line', // not specifying data here because defaulting to x: 0 and y: 1
label: 'foo',
order: 10
},
{
type: 'bar',
label: 'bar',
data: { y: 2 },
order: 5
}
financial: {
type: 'financial',
label: 'voo',
data: { o: 3, h: 4, l: 5, c:6 },
order: 3
}
],
scales: {
x: {
type: 'time',
parser: 'YYYY-MM-DD'
},
y: {
type: 'linear'
}
}
I was checking out a couple other libraries to see what they do. HighCharts, GoogleCharts, and uPlot (the names that were at the top of my head) all appear from my cursory glance to want data as an array of arrays and have parsing completely separated from controllers and scales as a step that happens before chart creation. HighCharts and GoogleCharts both give tools to manage parsing and other data manipulations.