@windborne/grapher 1.0.43 → 1.0.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundle.cjs +1 -1
- package/dist/bundle.cjs.map +1 -1
- package/dist/bundle.esm.js +1 -1
- package/dist/bundle.esm.js.map +1 -1
- package/package.json +1 -1
- package/src/state/calculate_data_bounds.js +2 -1
- package/src/state/expand_bounds.js +6 -2
- package/src/state/space_conversions/simple_series_to_data_space.js +22 -2
- package/src/state/state_controller.js +85 -5
package/package.json
CHANGED
|
@@ -66,7 +66,7 @@ export default function calculateDataBounds(inDataSpace, {percentile=100, percen
|
|
|
66
66
|
};
|
|
67
67
|
|
|
68
68
|
if (percentile !== 100 && inDataSpace.length) {
|
|
69
|
-
return percentileBounds(inDataSpace, bounds, {percentile, percentileAsymmetry});
|
|
69
|
+
return percentileBounds(inDataSpace, bounds, {percentile, percentileAsymmetry, rangeValues});
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
let dates = false;
|
|
@@ -117,6 +117,7 @@ export default function calculateDataBounds(inDataSpace, {percentile=100, percen
|
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
119
|
}
|
|
120
|
+
|
|
120
121
|
|
|
121
122
|
return finalizeBounds(bounds, {dates});
|
|
122
123
|
}
|
|
@@ -31,8 +31,12 @@ export default function expandBounds(bounds, {expandYWith = [], extendXForNBars=
|
|
|
31
31
|
|
|
32
32
|
const range = expandedBounds.maxY - expandedBounds.minY;
|
|
33
33
|
const midpoint = expandedBounds.minY + range/2;
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
const padding = 0.05 * range / 2;
|
|
35
|
+
const beforeMin = expandedBounds.minY;
|
|
36
|
+
const beforeMax = expandedBounds.maxY;
|
|
37
|
+
expandedBounds.minY = Math.min(expandedBounds.minY, midpoint - 1.05*range/2);
|
|
38
|
+
expandedBounds.maxY = Math.max(expandedBounds.maxY, midpoint + 1.05*range/2);
|
|
39
|
+
|
|
36
40
|
|
|
37
41
|
if (expandedBounds.minY === expandedBounds.maxY && expandedBounds.minY !== null) {
|
|
38
42
|
if (expandedBounds.minY > 0) {
|
|
@@ -14,12 +14,22 @@ export default function simpleSeriesToDataSpace(singleSeries, options={}) {
|
|
|
14
14
|
throw new Error(`Cannot normalize ${type} (expected a simple type)`);
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
const
|
|
17
|
+
const result = {
|
|
18
18
|
tuples: tuplesToDataSpace,
|
|
19
19
|
values: valuesToDataSpace,
|
|
20
20
|
objects: objectsToDataSpace
|
|
21
21
|
}[type](options.data || singleSeries.simpleData || singleSeries.data, singleSeries, options);
|
|
22
22
|
|
|
23
|
+
let inDataSpace;
|
|
24
|
+
let rangeValues = [];
|
|
25
|
+
|
|
26
|
+
if (Array.isArray(result)) {
|
|
27
|
+
inDataSpace = result;
|
|
28
|
+
} else {
|
|
29
|
+
inDataSpace = result.data;
|
|
30
|
+
rangeValues = result.rangeValues || [];
|
|
31
|
+
}
|
|
32
|
+
|
|
23
33
|
if (singleSeries.square) {
|
|
24
34
|
const square = [];
|
|
25
35
|
let prevY = options.prevY;
|
|
@@ -58,6 +68,13 @@ export default function simpleSeriesToDataSpace(singleSeries, options={}) {
|
|
|
58
68
|
}
|
|
59
69
|
}
|
|
60
70
|
|
|
71
|
+
if (rangeValues.length > 0) {
|
|
72
|
+
return {
|
|
73
|
+
data: inDataSpace,
|
|
74
|
+
rangeValues: rangeValues
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
61
78
|
return inDataSpace;
|
|
62
79
|
}
|
|
63
80
|
|
|
@@ -239,7 +256,10 @@ function objectsToDataSpace(data, series, options) {
|
|
|
239
256
|
}
|
|
240
257
|
|
|
241
258
|
if (rangeValues.length > 0) {
|
|
242
|
-
|
|
259
|
+
return {
|
|
260
|
+
data: inDataSpace,
|
|
261
|
+
rangeValues: rangeValues
|
|
262
|
+
};
|
|
243
263
|
}
|
|
244
264
|
|
|
245
265
|
return inDataSpace;
|
|
@@ -613,16 +613,35 @@ export default class StateController extends Eventable {
|
|
|
613
613
|
}
|
|
614
614
|
|
|
615
615
|
const simpleData = this._seriesToSimpleData(singleSeries);
|
|
616
|
-
|
|
616
|
+
const dataSpaceResult = simpleSeriesToDataSpace({
|
|
617
617
|
...singleSeries,
|
|
618
618
|
data: simpleData
|
|
619
619
|
}, {
|
|
620
620
|
stateController: this
|
|
621
621
|
});
|
|
622
|
+
|
|
623
|
+
let inDataSpace, rangeValues;
|
|
624
|
+
if (Array.isArray(dataSpaceResult)) {
|
|
625
|
+
inDataSpace = dataSpaceResult;
|
|
626
|
+
rangeValues = [];
|
|
627
|
+
} else {
|
|
628
|
+
inDataSpace = dataSpaceResult.data;
|
|
629
|
+
rangeValues = dataSpaceResult.rangeValues || [];
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
singleSeries.inDataSpace = inDataSpace;
|
|
622
633
|
singleSeries.simpleDataSliceStart = simpleData.length;
|
|
623
|
-
singleSeries.
|
|
624
|
-
|
|
634
|
+
singleSeries._rangeValues = rangeValues;
|
|
635
|
+
const allYValues = [...inDataSpace.map(([x, y]) => y).filter(y => typeof y === 'number'), ...rangeValues];
|
|
636
|
+
const extendedDataSpace = inDataSpace.map(([x, y]) => [x, y]);
|
|
637
|
+
for (let rangeValue of rangeValues) {
|
|
638
|
+
extendedDataSpace.push([null, rangeValue]);
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
singleSeries.dataBounds = calculateDataBounds(extendedDataSpace, {
|
|
642
|
+
rangeValues: rangeValues
|
|
625
643
|
});
|
|
644
|
+
|
|
626
645
|
if (singleSeries.rendering === 'bar') {
|
|
627
646
|
singleSeries.dataBounds = expandBounds(singleSeries.dataBounds, { extendXForNBars: singleSeries.inDataSpace.length, expandYWith: singleSeries.expandYWith });
|
|
628
647
|
}
|
|
@@ -780,7 +799,48 @@ export default class StateController extends Eventable {
|
|
|
780
799
|
axis.targetBounds = axis.targetBounds.byAxis[axis.axisIndex];
|
|
781
800
|
}
|
|
782
801
|
|
|
783
|
-
|
|
802
|
+
const expandYWith = [];
|
|
803
|
+
for (let singleSeries of axis.series) {
|
|
804
|
+
if (singleSeries._rangeValues && singleSeries._rangeValues.length > 0) {
|
|
805
|
+
const visibleDataPoints = singleSeries.inDataSpace.filter(([x, y]) =>
|
|
806
|
+
axis.targetBounds.minX <= x && x <= axis.targetBounds.maxX
|
|
807
|
+
);
|
|
808
|
+
|
|
809
|
+
const visibleRangeValues = [];
|
|
810
|
+
for (let i = 0; i < visibleDataPoints.length; i++) {
|
|
811
|
+
const dataPointIndex = singleSeries.inDataSpace.indexOf(visibleDataPoints[i]);
|
|
812
|
+
if (dataPointIndex >= 0) {
|
|
813
|
+
const rangeIndex = dataPointIndex * 2;
|
|
814
|
+
if (rangeIndex < singleSeries._rangeValues.length) {
|
|
815
|
+
visibleRangeValues.push(singleSeries._rangeValues[rangeIndex]);
|
|
816
|
+
if (rangeIndex + 1 < singleSeries._rangeValues.length) {
|
|
817
|
+
visibleRangeValues.push(singleSeries._rangeValues[rangeIndex + 1]);
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
if (visibleRangeValues.length > 0) {
|
|
824
|
+
expandYWith.push(...visibleRangeValues);
|
|
825
|
+
}
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
if (expandYWith.length > 0) {
|
|
830
|
+
const boundsToExpand = { ...axis.targetBounds };
|
|
831
|
+
|
|
832
|
+
if (boundsToExpand.minY === null) {
|
|
833
|
+
boundsToExpand.minY = Math.min(...expandYWith.filter(y => typeof y === 'number'));
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
if (boundsToExpand.maxY === null) {
|
|
837
|
+
boundsToExpand.maxY = Math.max(...expandYWith.filter(y => typeof y === 'number'));
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
axis.currentBounds = boundsToExpand;
|
|
841
|
+
} else {
|
|
842
|
+
axis.currentBounds = axis.targetBounds;
|
|
843
|
+
}
|
|
784
844
|
continue;
|
|
785
845
|
}
|
|
786
846
|
|
|
@@ -799,7 +859,27 @@ export default class StateController extends Eventable {
|
|
|
799
859
|
}
|
|
800
860
|
|
|
801
861
|
if (singleSeries._rangeValues && singleSeries._rangeValues.length > 0) {
|
|
802
|
-
|
|
862
|
+
const visibleDataPoints = singleSeries.inDataSpace.filter(([x, y]) =>
|
|
863
|
+
singleSeries.selectedBounds.minX <= x && x <= singleSeries.selectedBounds.maxX
|
|
864
|
+
);
|
|
865
|
+
|
|
866
|
+
const visibleRangeValues = [];
|
|
867
|
+
for (let i = 0; i < visibleDataPoints.length; i++) {
|
|
868
|
+
const dataPointIndex = singleSeries.inDataSpace.indexOf(visibleDataPoints[i]);
|
|
869
|
+
if (dataPointIndex >= 0) {
|
|
870
|
+
const rangeIndex = dataPointIndex * 2;
|
|
871
|
+
if (rangeIndex < singleSeries._rangeValues.length) {
|
|
872
|
+
visibleRangeValues.push(singleSeries._rangeValues[rangeIndex]);
|
|
873
|
+
if (rangeIndex + 1 < singleSeries._rangeValues.length) {
|
|
874
|
+
visibleRangeValues.push(singleSeries._rangeValues[rangeIndex + 1]);
|
|
875
|
+
}
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
if (visibleRangeValues.length > 0) {
|
|
881
|
+
expandYWith.push(...visibleRangeValues);
|
|
882
|
+
}
|
|
803
883
|
}
|
|
804
884
|
}
|
|
805
885
|
|