plotly.js 1.52.1 → 1.52.2

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.
Files changed (43) hide show
  1. package/.fossa.yml +58 -0
  2. package/.ignore +3 -0
  3. package/CHANGELOG.md +21 -0
  4. package/dist/README.md +25 -25
  5. package/dist/plot-schema.json +8 -8
  6. package/dist/plotly-basic.js +187 -54
  7. package/dist/plotly-basic.min.js +2 -2
  8. package/dist/plotly-cartesian.js +187 -54
  9. package/dist/plotly-cartesian.min.js +2 -2
  10. package/dist/plotly-finance.js +187 -54
  11. package/dist/plotly-finance.min.js +2 -2
  12. package/dist/plotly-geo-assets.js +2 -2
  13. package/dist/plotly-geo.js +168 -49
  14. package/dist/plotly-geo.min.js +2 -2
  15. package/dist/plotly-gl2d.js +173 -51
  16. package/dist/plotly-gl2d.min.js +2 -2
  17. package/dist/plotly-gl3d.js +668 -449
  18. package/dist/plotly-gl3d.min.js +2 -2
  19. package/dist/plotly-mapbox.js +170 -50
  20. package/dist/plotly-mapbox.min.js +2 -2
  21. package/dist/plotly-with-meta.js +823 -533
  22. package/dist/plotly.js +814 -525
  23. package/dist/plotly.min.js +2 -2
  24. package/package.json +24 -23
  25. package/src/assets/geo_assets.js +1 -1
  26. package/src/components/annotations/attributes.js +1 -1
  27. package/src/core.js +1 -1
  28. package/src/lib/index.js +6 -3
  29. package/src/plot_api/subroutines.js +6 -0
  30. package/src/plot_api/validate.js +4 -3
  31. package/src/plots/cartesian/axes.js +6 -2
  32. package/src/plots/cartesian/constants.js +1 -2
  33. package/src/plots/cartesian/layout_defaults.js +112 -27
  34. package/src/plots/gl3d/scene.js +361 -323
  35. package/src/plots/layout_attributes.js +2 -2
  36. package/src/plots/mapbox/layers.js +2 -1
  37. package/src/plots/plots.js +30 -9
  38. package/src/traces/bar/hover.js +6 -1
  39. package/src/traces/bar/plot.js +13 -4
  40. package/src/traces/mesh3d/convert.js +9 -5
  41. package/src/traces/pie/attributes.js +7 -6
  42. package/src/traces/treemap/plot.js +2 -0
  43. package/tasks/test_syntax.js +1 -1
@@ -1,5 +1,5 @@
1
1
  /**
2
- * plotly.js (gl2d) v1.52.1
2
+ * plotly.js (gl2d) v1.52.2
3
3
  * Copyright 2012-2020, Plotly, Inc.
4
4
  * All rights reserved.
5
5
  * Licensed under the MIT license
@@ -30337,8 +30337,11 @@ proto.dispose = function() {
30337
30337
  }
30338
30338
 
30339
30339
  function createSelectBuffer(gl, shape) {
30340
- var fbo = createFBO(gl, shape)
30341
- var buffer = pool.mallocUint8(shape[0]*shape[1]*4)
30340
+ var width = shape[0]
30341
+ var height = shape[1]
30342
+ var options = {}
30343
+ var fbo = createFBO(gl, width, height, options)
30344
+ var buffer = pool.mallocUint8(width*height*4)
30342
30345
  return new SelectBuffer(gl, fbo, buffer)
30343
30346
  }
30344
30347
 
@@ -67751,7 +67754,7 @@ exports.svgAttrs = {
67751
67754
  'use strict';
67752
67755
 
67753
67756
  // package version injected by `npm run preprocess`
67754
- exports.version = '1.52.1';
67757
+ exports.version = '1.52.2';
67755
67758
 
67756
67759
  // inject promise polyfill
67757
67760
  _dereq_('es6-promise').polyfill();
@@ -71478,11 +71481,14 @@ lib.templateString = function(string, obj) {
71478
71481
  var getterCache = {};
71479
71482
 
71480
71483
  return string.replace(lib.TEMPLATE_STRING_REGEX, function(dummy, key) {
71484
+ var v;
71481
71485
  if(SIMPLE_PROPERTY_REGEX.test(key)) {
71482
- return obj[key] || '';
71486
+ v = obj[key];
71487
+ } else {
71488
+ getterCache[key] = getterCache[key] || lib.nestedProperty(obj, key).get;
71489
+ v = getterCache[key]();
71483
71490
  }
71484
- getterCache[key] = getterCache[key] || lib.nestedProperty(obj, key).get;
71485
- return getterCache[key]() || '';
71491
+ return lib.isValidTextValue(v) ? v : '';
71486
71492
  });
71487
71493
  };
71488
71494
 
@@ -81825,6 +81831,7 @@ exports.doAutoRangeAndConstraints = function(gd) {
81825
81831
  var fullLayout = gd._fullLayout;
81826
81832
  var axList = Axes.list(gd, '', true);
81827
81833
  var matchGroups = fullLayout._axisMatchGroups || [];
81834
+ var axLookup = {};
81828
81835
  var ax;
81829
81836
  var axRng;
81830
81837
 
@@ -81832,6 +81839,7 @@ exports.doAutoRangeAndConstraints = function(gd) {
81832
81839
  ax = axList[i];
81833
81840
  cleanAxisConstraints(gd, ax);
81834
81841
  doAutoRange(gd, ax);
81842
+ axLookup[ax._id] = 1;
81835
81843
  }
81836
81844
 
81837
81845
  enforceAxisConstraints(gd);
@@ -81844,6 +81852,10 @@ exports.doAutoRangeAndConstraints = function(gd) {
81844
81852
 
81845
81853
  for(id in group) {
81846
81854
  ax = Axes.getFromId(gd, id);
81855
+
81856
+ // skip over 'missing' axes which do not pass through doAutoRange
81857
+ if(!axLookup[ax._id]) continue;
81858
+ // if one axis has autorange false, we're done
81847
81859
  if(ax.autorange === false) continue groupLoop;
81848
81860
 
81849
81861
  axRng = Lib.simpleMap(ax.range, ax.r2l);
@@ -82721,13 +82733,14 @@ function crawl(objIn, objOut, schema, list, base, path) {
82721
82733
  var valOut = objOut[k];
82722
82734
 
82723
82735
  var nestedSchema = getNestedSchema(schema, k);
82724
- var isInfoArray = (nestedSchema || {}).valType === 'info_array';
82725
- var isColorscale = (nestedSchema || {}).valType === 'colorscale';
82736
+ var nestedValType = (nestedSchema || {}).valType;
82737
+ var isInfoArray = nestedValType === 'info_array';
82738
+ var isColorscale = nestedValType === 'colorscale';
82726
82739
  var items = (nestedSchema || {}).items;
82727
82740
 
82728
82741
  if(!isInSchema(schema, k)) {
82729
82742
  list.push(format('schema', base, p));
82730
- } else if(isPlainObject(valIn) && isPlainObject(valOut)) {
82743
+ } else if(isPlainObject(valIn) && isPlainObject(valOut) && nestedValType !== 'any') {
82731
82744
  crawl(valIn, valOut, nestedSchema, list, base, p);
82732
82745
  } else if(isInfoArray && isArray(valIn)) {
82733
82746
  if(valIn.length > valOut.length) {
@@ -85532,10 +85545,14 @@ axes.drawOne = function(gd, ax, opts) {
85532
85545
  var axId = ax._id;
85533
85546
  var axLetter = axId.charAt(0);
85534
85547
  var counterLetter = axes.counterLetter(axId);
85535
- var mainLinePosition = ax._mainLinePosition;
85536
- var mainMirrorPosition = ax._mainMirrorPosition;
85537
85548
  var mainPlotinfo = fullLayout._plots[ax._mainSubplot];
85549
+
85550
+ // this happens when updating matched group with 'missing' axes
85551
+ if(!mainPlotinfo) return;
85552
+
85538
85553
  var mainAxLayer = mainPlotinfo[axLetter + 'axislayer'];
85554
+ var mainLinePosition = ax._mainLinePosition;
85555
+ var mainMirrorPosition = ax._mainMirrorPosition;
85539
85556
 
85540
85557
  var vals = ax._vals = axes.calcTicks(ax);
85541
85558
 
@@ -87494,11 +87511,10 @@ exports.tick0 = function(tick0, axType, calendar, dtick) {
87494
87511
  */
87495
87512
 
87496
87513
  'use strict';
87497
- var counterRegex = _dereq_('../../lib/regex').counter;
87498
87514
 
87515
+ var counterRegex = _dereq_('../../lib/regex').counter;
87499
87516
 
87500
87517
  module.exports = {
87501
-
87502
87518
  idRegex: {
87503
87519
  x: counterRegex('x'),
87504
87520
  y: counterRegex('y')
@@ -90688,6 +90704,8 @@ var axisIds = _dereq_('./axis_ids');
90688
90704
  var id2name = axisIds.id2name;
90689
90705
  var name2id = axisIds.name2id;
90690
90706
 
90707
+ var AX_ID_PATTERN = _dereq_('./constants').AX_ID_PATTERN;
90708
+
90691
90709
  var Registry = _dereq_('../../registry');
90692
90710
  var traceIs = Registry.traceIs;
90693
90711
  var getComponentMethod = Registry.getComponentMethod;
@@ -90797,7 +90815,28 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) {
90797
90815
 
90798
90816
  var bgColor = Color.combine(plotBgColor, layoutOut.paper_bgcolor);
90799
90817
 
90800
- var axName, axLetter, axLayoutIn, axLayoutOut;
90818
+ // name of single axis (e.g. 'xaxis', 'yaxis2')
90819
+ var axName;
90820
+ // id of single axis (e.g. 'y', 'x5')
90821
+ var axId;
90822
+ // 'x' or 'y'
90823
+ var axLetter;
90824
+ // input layout axis container
90825
+ var axLayoutIn;
90826
+ // full layout axis container
90827
+ var axLayoutOut;
90828
+
90829
+ function newAxLayoutOut() {
90830
+ var traces = ax2traces[axName] || [];
90831
+ axLayoutOut._traceIndices = traces.map(function(t) { return t._expandedIndex; });
90832
+ axLayoutOut._annIndices = [];
90833
+ axLayoutOut._shapeIndices = [];
90834
+ axLayoutOut._imgIndices = [];
90835
+ axLayoutOut._subplotsWith = [];
90836
+ axLayoutOut._counterAxes = [];
90837
+ axLayoutOut._name = axLayoutOut._attr = axName;
90838
+ axLayoutOut._id = axId;
90839
+ }
90801
90840
 
90802
90841
  function coerce(attr, dflt) {
90803
90842
  return Lib.coerce(axLayoutIn, axLayoutOut, layoutAttributes, attr, dflt);
@@ -90811,9 +90850,6 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) {
90811
90850
  return (axLetter === 'x') ? yIds : xIds;
90812
90851
  }
90813
90852
 
90814
- var counterAxes = {x: getCounterAxes('x'), y: getCounterAxes('y')};
90815
- var allAxisIds = counterAxes.x.concat(counterAxes.y);
90816
-
90817
90853
  function getOverlayableAxes(axLetter, axName) {
90818
90854
  var list = (axLetter === 'x') ? xNames : yNames;
90819
90855
  var out = [];
@@ -90829,9 +90865,30 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) {
90829
90865
  return out;
90830
90866
  }
90831
90867
 
90868
+ // list of available counter axis names
90869
+ var counterAxes = {x: getCounterAxes('x'), y: getCounterAxes('y')};
90870
+ // list of all x AND y axis ids
90871
+ var allAxisIds = counterAxes.x.concat(counterAxes.y);
90872
+ // lookup and list of axis ids that axes in axNames have a reference to,
90873
+ // even though they are missing from allAxisIds
90874
+ var missingMatchedAxisIdsLookup = {};
90875
+ var missingMatchedAxisIds = [];
90876
+
90877
+ // fill in 'missing' axis lookup when an axis is set to match an axis
90878
+ // not part of the allAxisIds list, save axis type so that we can propagate
90879
+ // it to the missing axes
90880
+ function addMissingMatchedAxis() {
90881
+ var matchesIn = axLayoutIn.matches;
90882
+ if(AX_ID_PATTERN.test(matchesIn) && allAxisIds.indexOf(matchesIn) === -1) {
90883
+ missingMatchedAxisIdsLookup[matchesIn] = axLayoutIn.type;
90884
+ missingMatchedAxisIds = Object.keys(missingMatchedAxisIdsLookup);
90885
+ }
90886
+ }
90887
+
90832
90888
  // first pass creates the containers, determines types, and handles most of the settings
90833
90889
  for(i = 0; i < axNames.length; i++) {
90834
90890
  axName = axNames[i];
90891
+ axId = name2id(axName);
90835
90892
  axLetter = axName.charAt(0);
90836
90893
 
90837
90894
  if(!Lib.isPlainObject(layoutIn[axName])) {
@@ -90840,20 +90897,7 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) {
90840
90897
 
90841
90898
  axLayoutIn = layoutIn[axName];
90842
90899
  axLayoutOut = Template.newContainer(layoutOut, axName, axLetter + 'axis');
90843
-
90844
- var traces = ax2traces[axName] || [];
90845
- axLayoutOut._traceIndices = traces.map(function(t) { return t._expandedIndex; });
90846
- axLayoutOut._annIndices = [];
90847
- axLayoutOut._shapeIndices = [];
90848
- axLayoutOut._imgIndices = [];
90849
- axLayoutOut._subplotsWith = [];
90850
- axLayoutOut._counterAxes = [];
90851
-
90852
- // set up some private properties
90853
- axLayoutOut._name = axLayoutOut._attr = axName;
90854
- var id = axLayoutOut._id = name2id(axName);
90855
-
90856
- var overlayableAxes = getOverlayableAxes(axLetter, axName);
90900
+ newAxLayoutOut();
90857
90901
 
90858
90902
  var visibleDflt =
90859
90903
  (axLetter === 'x' && !xaMustDisplay[axName] && xaMayHide[axName]) ||
@@ -90871,13 +90915,13 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) {
90871
90915
  font: layoutOut.font,
90872
90916
  outerTicks: outerTicks[axName],
90873
90917
  showGrid: !noGrids[axName],
90874
- data: traces,
90918
+ data: ax2traces[axName] || [],
90875
90919
  bgColor: bgColor,
90876
90920
  calendar: layoutOut.calendar,
90877
90921
  automargin: true,
90878
90922
  visibleDflt: visibleDflt,
90879
90923
  reverseDflt: reverseDflt,
90880
- splomStash: ((layoutOut._splomAxes || {})[axLetter] || {})[id]
90924
+ splomStash: ((layoutOut._splomAxes || {})[axLetter] || {})[axId]
90881
90925
  };
90882
90926
 
90883
90927
  coerce('uirevision', layoutOut.uirevision);
@@ -90903,12 +90947,63 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) {
90903
90947
  handlePositionDefaults(axLayoutIn, axLayoutOut, coerce, {
90904
90948
  letter: axLetter,
90905
90949
  counterAxes: counterAxes[axLetter],
90906
- overlayableAxes: overlayableAxes,
90950
+ overlayableAxes: getOverlayableAxes(axLetter, axName),
90907
90951
  grid: layoutOut.grid
90908
90952
  });
90909
90953
 
90910
90954
  coerce('title.standoff');
90911
90955
 
90956
+ addMissingMatchedAxis();
90957
+
90958
+ axLayoutOut._input = axLayoutIn;
90959
+ }
90960
+
90961
+ // coerce the 'missing' axes
90962
+ i = 0;
90963
+ while(i < missingMatchedAxisIds.length) {
90964
+ axId = missingMatchedAxisIds[i++];
90965
+ axName = id2name(axId);
90966
+ axLetter = axName.charAt(0);
90967
+
90968
+ if(!Lib.isPlainObject(layoutIn[axName])) {
90969
+ layoutIn[axName] = {};
90970
+ }
90971
+
90972
+ axLayoutIn = layoutIn[axName];
90973
+ axLayoutOut = Template.newContainer(layoutOut, axName, axLetter + 'axis');
90974
+ newAxLayoutOut();
90975
+
90976
+ var defaultOptions2 = {
90977
+ letter: axLetter,
90978
+ font: layoutOut.font,
90979
+ outerTicks: outerTicks[axName],
90980
+ showGrid: !noGrids[axName],
90981
+ data: [],
90982
+ bgColor: bgColor,
90983
+ calendar: layoutOut.calendar,
90984
+ automargin: true,
90985
+ visibleDflt: false,
90986
+ reverseDflt: false,
90987
+ splomStash: ((layoutOut._splomAxes || {})[axLetter] || {})[axId]
90988
+ };
90989
+
90990
+ coerce('uirevision', layoutOut.uirevision);
90991
+
90992
+ axLayoutOut.type = missingMatchedAxisIdsLookup[axId] || 'linear';
90993
+
90994
+ handleAxisDefaults(axLayoutIn, axLayoutOut, coerce, defaultOptions2, layoutOut);
90995
+
90996
+ handlePositionDefaults(axLayoutIn, axLayoutOut, coerce, {
90997
+ letter: axLetter,
90998
+ counterAxes: counterAxes[axLetter],
90999
+ overlayableAxes: getOverlayableAxes(axLetter, axName),
91000
+ grid: layoutOut.grid
91001
+ });
91002
+
91003
+ coerce('fixedrange');
91004
+
91005
+ addMissingMatchedAxis();
91006
+
90912
91007
  axLayoutOut._input = axLayoutIn;
90913
91008
  }
90914
91009
 
@@ -90959,9 +91054,12 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) {
90959
91054
  var constraintGroups = layoutOut._axisConstraintGroups = [];
90960
91055
  // similar to _axisConstraintGroups, but for matching axes
90961
91056
  var matchGroups = layoutOut._axisMatchGroups = [];
91057
+ // make sure to include 'missing' axes here
91058
+ var allAxisIdsIncludingMissing = allAxisIds.concat(missingMatchedAxisIds);
91059
+ var axNamesIncludingMissing = axNames.concat(Lib.simpleMap(missingMatchedAxisIds, id2name));
90962
91060
 
90963
- for(i = 0; i < axNames.length; i++) {
90964
- axName = axNames[i];
91061
+ for(i = 0; i < axNamesIncludingMissing.length; i++) {
91062
+ axName = axNamesIncludingMissing[i];
90965
91063
  axLetter = axName.charAt(0);
90966
91064
  axLayoutIn = layoutIn[axName];
90967
91065
  axLayoutOut = layoutOut[axName];
@@ -90969,15 +91067,19 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) {
90969
91067
  var scaleanchorDflt;
90970
91068
  if(axLetter === 'y' && !axLayoutIn.hasOwnProperty('scaleanchor') && axHasImage[axName]) {
90971
91069
  scaleanchorDflt = axLayoutOut.anchor;
90972
- } else {scaleanchorDflt = undefined;}
91070
+ } else {
91071
+ scaleanchorDflt = undefined;
91072
+ }
90973
91073
 
90974
91074
  var constrainDflt;
90975
91075
  if(!axLayoutIn.hasOwnProperty('constrain') && axHasImage[axName]) {
90976
91076
  constrainDflt = 'domain';
90977
- } else {constrainDflt = undefined;}
91077
+ } else {
91078
+ constrainDflt = undefined;
91079
+ }
90978
91080
 
90979
91081
  handleConstraintDefaults(axLayoutIn, axLayoutOut, coerce, {
90980
- allAxisIds: allAxisIds,
91082
+ allAxisIds: allAxisIdsIncludingMissing,
90981
91083
  layoutOut: layoutOut,
90982
91084
  scaleanchorDflt: scaleanchorDflt,
90983
91085
  constrainDflt: constrainDflt
@@ -90988,7 +91090,6 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) {
90988
91090
  var group = matchGroups[i];
90989
91091
  var rng = null;
90990
91092
  var autorange = null;
90991
- var axId;
90992
91093
 
90993
91094
  // find 'matching' range attrs
90994
91095
  for(axId in group) {
@@ -91041,7 +91142,7 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) {
91041
91142
  }
91042
91143
  };
91043
91144
 
91044
- },{"../../components/color":320,"../../lib":440,"../../plot_api/plot_template":477,"../../registry":531,"../layout_attributes":521,"./axis_defaults":489,"./axis_ids":490,"./constraints":494,"./layout_attributes":499,"./position_defaults":502,"./type_defaults":510}],501:[function(_dereq_,module,exports){
91145
+ },{"../../components/color":320,"../../lib":440,"../../plot_api/plot_template":477,"../../registry":531,"../layout_attributes":521,"./axis_defaults":489,"./axis_ids":490,"./constants":493,"./constraints":494,"./layout_attributes":499,"./position_defaults":502,"./type_defaults":510}],501:[function(_dereq_,module,exports){
91045
91146
  /**
91046
91147
  * Copyright 2012-2020, Plotly, Inc.
91047
91148
  * All rights reserved.
@@ -97117,10 +97218,13 @@ plots.supplyTraceDefaults = function(traceIn, traceOut, colorIndex, layout, trac
97117
97218
  var subplots = layout._subplots;
97118
97219
  var subplotId = '';
97119
97220
 
97120
- // TODO - currently if we draw an empty gl2d subplot, it draws
97121
- // nothing then gets stuck and you can't get it back without newPlot
97122
- // sort this out in the regl refactor? but for now just drop empty gl2d subplots
97123
- if(basePlotModule.name !== 'gl2d' || visible) {
97221
+ if(
97222
+ visible ||
97223
+ basePlotModule.name !== 'gl2d' // for now just drop empty gl2d subplots
97224
+ // TODO - currently if we draw an empty gl2d subplot, it draws
97225
+ // nothing then gets stuck and you can't get it back without newPlot
97226
+ // sort this out in the regl refactor?
97227
+ ) {
97124
97228
  if(Array.isArray(subplotAttr)) {
97125
97229
  for(i = 0; i < subplotAttr.length; i++) {
97126
97230
  var attri = subplotAttr[i];
@@ -98779,7 +98883,7 @@ plots.doCalcdata = function(gd, traces) {
98779
98883
  calcdata[i] = cd;
98780
98884
  }
98781
98885
 
98782
- setupAxisCategories(axList, fullData);
98886
+ setupAxisCategories(axList, fullData, fullLayout);
98783
98887
 
98784
98888
  // 'transform' loop - must calc container traces first
98785
98889
  // so that if their dependent traces can get transform properly
@@ -98787,7 +98891,7 @@ plots.doCalcdata = function(gd, traces) {
98787
98891
  for(i = 0; i < fullData.length; i++) transformCalci(i);
98788
98892
 
98789
98893
  // clear stuff that should recomputed in 'regular' loop
98790
- if(hasCalcTransform) setupAxisCategories(axList, fullData);
98894
+ if(hasCalcTransform) setupAxisCategories(axList, fullData, fullLayout);
98791
98895
 
98792
98896
  // 'regular' loop - make sure container traces (eg carpet) calc before
98793
98897
  // contained traces (eg contourcarpet)
@@ -98992,13 +99096,31 @@ function sortAxisCategoriesByValue(axList, gd) {
98992
99096
  return affectedTraces;
98993
99097
  }
98994
99098
 
98995
- function setupAxisCategories(axList, fullData) {
98996
- for(var i = 0; i < axList.length; i++) {
98997
- var ax = axList[i];
99099
+ function setupAxisCategories(axList, fullData, fullLayout) {
99100
+ var axLookup = {};
99101
+ var i, ax, axId;
99102
+
99103
+ for(i = 0; i < axList.length; i++) {
99104
+ ax = axList[i];
99105
+ axId = ax._id;
99106
+
98998
99107
  ax.clearCalc();
98999
99108
  if(ax.type === 'multicategory') {
99000
99109
  ax.setupMultiCategory(fullData);
99001
99110
  }
99111
+
99112
+ axLookup[ax._id] = 1;
99113
+ }
99114
+
99115
+ // look into match groups for 'missing' axes
99116
+ var matchGroups = fullLayout._axisMatchGroups || [];
99117
+ for(i = 0; i < matchGroups.length; i++) {
99118
+ for(axId in matchGroups[i]) {
99119
+ if(!axLookup[axId]) {
99120
+ ax = fullLayout[axisIDs.id2name(axId)];
99121
+ ax.clearCalc();
99122
+ }
99123
+ }
99002
99124
  }
99003
99125
  }
99004
99126