@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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@windborne/grapher",
3
- "version": "1.0.43",
3
+ "version": "1.0.45",
4
4
  "description": "Graphing library",
5
5
  "main": "src/index.js",
6
6
  "module": "dist/bundle.esm.js",
@@ -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
- expandedBounds.minY = midpoint - 1.05*range/2;
35
- expandedBounds.maxY = midpoint + 1.05*range/2;
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 inDataSpace = {
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
- series._rangeValues = rangeValues;
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
- singleSeries.inDataSpace = simpleSeriesToDataSpace({
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.dataBounds = calculateDataBounds(singleSeries.inDataSpace, {
624
- rangeValues: singleSeries._rangeValues || []
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
- axis.currentBounds = axis.targetBounds;
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
- expandYWith.push(...singleSeries._rangeValues);
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