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 (mapbox) v1.52.1
2
+ * plotly.js (mapbox) v1.52.2
3
3
  * Copyright 2012-2020, Plotly, Inc.
4
4
  * All rights reserved.
5
5
  * Licensed under the MIT license
@@ -36691,7 +36691,7 @@ exports.svgAttrs = {
36691
36691
  'use strict';
36692
36692
 
36693
36693
  // package version injected by `npm run preprocess`
36694
- exports.version = '1.52.1';
36694
+ exports.version = '1.52.2';
36695
36695
 
36696
36696
  // inject promise polyfill
36697
36697
  _dereq_('es6-promise').polyfill();
@@ -40780,11 +40780,14 @@ lib.templateString = function(string, obj) {
40780
40780
  var getterCache = {};
40781
40781
 
40782
40782
  return string.replace(lib.TEMPLATE_STRING_REGEX, function(dummy, key) {
40783
+ var v;
40783
40784
  if(SIMPLE_PROPERTY_REGEX.test(key)) {
40784
- return obj[key] || '';
40785
+ v = obj[key];
40786
+ } else {
40787
+ getterCache[key] = getterCache[key] || lib.nestedProperty(obj, key).get;
40788
+ v = getterCache[key]();
40785
40789
  }
40786
- getterCache[key] = getterCache[key] || lib.nestedProperty(obj, key).get;
40787
- return getterCache[key]() || '';
40790
+ return lib.isValidTextValue(v) ? v : '';
40788
40791
  });
40789
40792
  };
40790
40793
 
@@ -50970,6 +50973,7 @@ exports.doAutoRangeAndConstraints = function(gd) {
50970
50973
  var fullLayout = gd._fullLayout;
50971
50974
  var axList = Axes.list(gd, '', true);
50972
50975
  var matchGroups = fullLayout._axisMatchGroups || [];
50976
+ var axLookup = {};
50973
50977
  var ax;
50974
50978
  var axRng;
50975
50979
 
@@ -50977,6 +50981,7 @@ exports.doAutoRangeAndConstraints = function(gd) {
50977
50981
  ax = axList[i];
50978
50982
  cleanAxisConstraints(gd, ax);
50979
50983
  doAutoRange(gd, ax);
50984
+ axLookup[ax._id] = 1;
50980
50985
  }
50981
50986
 
50982
50987
  enforceAxisConstraints(gd);
@@ -50989,6 +50994,10 @@ exports.doAutoRangeAndConstraints = function(gd) {
50989
50994
 
50990
50995
  for(id in group) {
50991
50996
  ax = Axes.getFromId(gd, id);
50997
+
50998
+ // skip over 'missing' axes which do not pass through doAutoRange
50999
+ if(!axLookup[ax._id]) continue;
51000
+ // if one axis has autorange false, we're done
50992
51001
  if(ax.autorange === false) continue groupLoop;
50993
51002
 
50994
51003
  axRng = Lib.simpleMap(ax.range, ax.r2l);
@@ -51866,13 +51875,14 @@ function crawl(objIn, objOut, schema, list, base, path) {
51866
51875
  var valOut = objOut[k];
51867
51876
 
51868
51877
  var nestedSchema = getNestedSchema(schema, k);
51869
- var isInfoArray = (nestedSchema || {}).valType === 'info_array';
51870
- var isColorscale = (nestedSchema || {}).valType === 'colorscale';
51878
+ var nestedValType = (nestedSchema || {}).valType;
51879
+ var isInfoArray = nestedValType === 'info_array';
51880
+ var isColorscale = nestedValType === 'colorscale';
51871
51881
  var items = (nestedSchema || {}).items;
51872
51882
 
51873
51883
  if(!isInSchema(schema, k)) {
51874
51884
  list.push(format('schema', base, p));
51875
- } else if(isPlainObject(valIn) && isPlainObject(valOut)) {
51885
+ } else if(isPlainObject(valIn) && isPlainObject(valOut) && nestedValType !== 'any') {
51876
51886
  crawl(valIn, valOut, nestedSchema, list, base, p);
51877
51887
  } else if(isInfoArray && isArray(valIn)) {
51878
51888
  if(valIn.length > valOut.length) {
@@ -54677,10 +54687,14 @@ axes.drawOne = function(gd, ax, opts) {
54677
54687
  var axId = ax._id;
54678
54688
  var axLetter = axId.charAt(0);
54679
54689
  var counterLetter = axes.counterLetter(axId);
54680
- var mainLinePosition = ax._mainLinePosition;
54681
- var mainMirrorPosition = ax._mainMirrorPosition;
54682
54690
  var mainPlotinfo = fullLayout._plots[ax._mainSubplot];
54691
+
54692
+ // this happens when updating matched group with 'missing' axes
54693
+ if(!mainPlotinfo) return;
54694
+
54683
54695
  var mainAxLayer = mainPlotinfo[axLetter + 'axislayer'];
54696
+ var mainLinePosition = ax._mainLinePosition;
54697
+ var mainMirrorPosition = ax._mainMirrorPosition;
54684
54698
 
54685
54699
  var vals = ax._vals = axes.calcTicks(ax);
54686
54700
 
@@ -56639,11 +56653,10 @@ exports.tick0 = function(tick0, axType, calendar, dtick) {
56639
56653
  */
56640
56654
 
56641
56655
  'use strict';
56642
- var counterRegex = _dereq_('../../lib/regex').counter;
56643
56656
 
56657
+ var counterRegex = _dereq_('../../lib/regex').counter;
56644
56658
 
56645
56659
  module.exports = {
56646
-
56647
56660
  idRegex: {
56648
56661
  x: counterRegex('x'),
56649
56662
  y: counterRegex('y')
@@ -59833,6 +59846,8 @@ var axisIds = _dereq_('./axis_ids');
59833
59846
  var id2name = axisIds.id2name;
59834
59847
  var name2id = axisIds.name2id;
59835
59848
 
59849
+ var AX_ID_PATTERN = _dereq_('./constants').AX_ID_PATTERN;
59850
+
59836
59851
  var Registry = _dereq_('../../registry');
59837
59852
  var traceIs = Registry.traceIs;
59838
59853
  var getComponentMethod = Registry.getComponentMethod;
@@ -59942,7 +59957,28 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) {
59942
59957
 
59943
59958
  var bgColor = Color.combine(plotBgColor, layoutOut.paper_bgcolor);
59944
59959
 
59945
- var axName, axLetter, axLayoutIn, axLayoutOut;
59960
+ // name of single axis (e.g. 'xaxis', 'yaxis2')
59961
+ var axName;
59962
+ // id of single axis (e.g. 'y', 'x5')
59963
+ var axId;
59964
+ // 'x' or 'y'
59965
+ var axLetter;
59966
+ // input layout axis container
59967
+ var axLayoutIn;
59968
+ // full layout axis container
59969
+ var axLayoutOut;
59970
+
59971
+ function newAxLayoutOut() {
59972
+ var traces = ax2traces[axName] || [];
59973
+ axLayoutOut._traceIndices = traces.map(function(t) { return t._expandedIndex; });
59974
+ axLayoutOut._annIndices = [];
59975
+ axLayoutOut._shapeIndices = [];
59976
+ axLayoutOut._imgIndices = [];
59977
+ axLayoutOut._subplotsWith = [];
59978
+ axLayoutOut._counterAxes = [];
59979
+ axLayoutOut._name = axLayoutOut._attr = axName;
59980
+ axLayoutOut._id = axId;
59981
+ }
59946
59982
 
59947
59983
  function coerce(attr, dflt) {
59948
59984
  return Lib.coerce(axLayoutIn, axLayoutOut, layoutAttributes, attr, dflt);
@@ -59956,9 +59992,6 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) {
59956
59992
  return (axLetter === 'x') ? yIds : xIds;
59957
59993
  }
59958
59994
 
59959
- var counterAxes = {x: getCounterAxes('x'), y: getCounterAxes('y')};
59960
- var allAxisIds = counterAxes.x.concat(counterAxes.y);
59961
-
59962
59995
  function getOverlayableAxes(axLetter, axName) {
59963
59996
  var list = (axLetter === 'x') ? xNames : yNames;
59964
59997
  var out = [];
@@ -59974,9 +60007,30 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) {
59974
60007
  return out;
59975
60008
  }
59976
60009
 
60010
+ // list of available counter axis names
60011
+ var counterAxes = {x: getCounterAxes('x'), y: getCounterAxes('y')};
60012
+ // list of all x AND y axis ids
60013
+ var allAxisIds = counterAxes.x.concat(counterAxes.y);
60014
+ // lookup and list of axis ids that axes in axNames have a reference to,
60015
+ // even though they are missing from allAxisIds
60016
+ var missingMatchedAxisIdsLookup = {};
60017
+ var missingMatchedAxisIds = [];
60018
+
60019
+ // fill in 'missing' axis lookup when an axis is set to match an axis
60020
+ // not part of the allAxisIds list, save axis type so that we can propagate
60021
+ // it to the missing axes
60022
+ function addMissingMatchedAxis() {
60023
+ var matchesIn = axLayoutIn.matches;
60024
+ if(AX_ID_PATTERN.test(matchesIn) && allAxisIds.indexOf(matchesIn) === -1) {
60025
+ missingMatchedAxisIdsLookup[matchesIn] = axLayoutIn.type;
60026
+ missingMatchedAxisIds = Object.keys(missingMatchedAxisIdsLookup);
60027
+ }
60028
+ }
60029
+
59977
60030
  // first pass creates the containers, determines types, and handles most of the settings
59978
60031
  for(i = 0; i < axNames.length; i++) {
59979
60032
  axName = axNames[i];
60033
+ axId = name2id(axName);
59980
60034
  axLetter = axName.charAt(0);
59981
60035
 
59982
60036
  if(!Lib.isPlainObject(layoutIn[axName])) {
@@ -59985,20 +60039,7 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) {
59985
60039
 
59986
60040
  axLayoutIn = layoutIn[axName];
59987
60041
  axLayoutOut = Template.newContainer(layoutOut, axName, axLetter + 'axis');
59988
-
59989
- var traces = ax2traces[axName] || [];
59990
- axLayoutOut._traceIndices = traces.map(function(t) { return t._expandedIndex; });
59991
- axLayoutOut._annIndices = [];
59992
- axLayoutOut._shapeIndices = [];
59993
- axLayoutOut._imgIndices = [];
59994
- axLayoutOut._subplotsWith = [];
59995
- axLayoutOut._counterAxes = [];
59996
-
59997
- // set up some private properties
59998
- axLayoutOut._name = axLayoutOut._attr = axName;
59999
- var id = axLayoutOut._id = name2id(axName);
60000
-
60001
- var overlayableAxes = getOverlayableAxes(axLetter, axName);
60042
+ newAxLayoutOut();
60002
60043
 
60003
60044
  var visibleDflt =
60004
60045
  (axLetter === 'x' && !xaMustDisplay[axName] && xaMayHide[axName]) ||
@@ -60016,13 +60057,13 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) {
60016
60057
  font: layoutOut.font,
60017
60058
  outerTicks: outerTicks[axName],
60018
60059
  showGrid: !noGrids[axName],
60019
- data: traces,
60060
+ data: ax2traces[axName] || [],
60020
60061
  bgColor: bgColor,
60021
60062
  calendar: layoutOut.calendar,
60022
60063
  automargin: true,
60023
60064
  visibleDflt: visibleDflt,
60024
60065
  reverseDflt: reverseDflt,
60025
- splomStash: ((layoutOut._splomAxes || {})[axLetter] || {})[id]
60066
+ splomStash: ((layoutOut._splomAxes || {})[axLetter] || {})[axId]
60026
60067
  };
60027
60068
 
60028
60069
  coerce('uirevision', layoutOut.uirevision);
@@ -60048,12 +60089,63 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) {
60048
60089
  handlePositionDefaults(axLayoutIn, axLayoutOut, coerce, {
60049
60090
  letter: axLetter,
60050
60091
  counterAxes: counterAxes[axLetter],
60051
- overlayableAxes: overlayableAxes,
60092
+ overlayableAxes: getOverlayableAxes(axLetter, axName),
60052
60093
  grid: layoutOut.grid
60053
60094
  });
60054
60095
 
60055
60096
  coerce('title.standoff');
60056
60097
 
60098
+ addMissingMatchedAxis();
60099
+
60100
+ axLayoutOut._input = axLayoutIn;
60101
+ }
60102
+
60103
+ // coerce the 'missing' axes
60104
+ i = 0;
60105
+ while(i < missingMatchedAxisIds.length) {
60106
+ axId = missingMatchedAxisIds[i++];
60107
+ axName = id2name(axId);
60108
+ axLetter = axName.charAt(0);
60109
+
60110
+ if(!Lib.isPlainObject(layoutIn[axName])) {
60111
+ layoutIn[axName] = {};
60112
+ }
60113
+
60114
+ axLayoutIn = layoutIn[axName];
60115
+ axLayoutOut = Template.newContainer(layoutOut, axName, axLetter + 'axis');
60116
+ newAxLayoutOut();
60117
+
60118
+ var defaultOptions2 = {
60119
+ letter: axLetter,
60120
+ font: layoutOut.font,
60121
+ outerTicks: outerTicks[axName],
60122
+ showGrid: !noGrids[axName],
60123
+ data: [],
60124
+ bgColor: bgColor,
60125
+ calendar: layoutOut.calendar,
60126
+ automargin: true,
60127
+ visibleDflt: false,
60128
+ reverseDflt: false,
60129
+ splomStash: ((layoutOut._splomAxes || {})[axLetter] || {})[axId]
60130
+ };
60131
+
60132
+ coerce('uirevision', layoutOut.uirevision);
60133
+
60134
+ axLayoutOut.type = missingMatchedAxisIdsLookup[axId] || 'linear';
60135
+
60136
+ handleAxisDefaults(axLayoutIn, axLayoutOut, coerce, defaultOptions2, layoutOut);
60137
+
60138
+ handlePositionDefaults(axLayoutIn, axLayoutOut, coerce, {
60139
+ letter: axLetter,
60140
+ counterAxes: counterAxes[axLetter],
60141
+ overlayableAxes: getOverlayableAxes(axLetter, axName),
60142
+ grid: layoutOut.grid
60143
+ });
60144
+
60145
+ coerce('fixedrange');
60146
+
60147
+ addMissingMatchedAxis();
60148
+
60057
60149
  axLayoutOut._input = axLayoutIn;
60058
60150
  }
60059
60151
 
@@ -60104,9 +60196,12 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) {
60104
60196
  var constraintGroups = layoutOut._axisConstraintGroups = [];
60105
60197
  // similar to _axisConstraintGroups, but for matching axes
60106
60198
  var matchGroups = layoutOut._axisMatchGroups = [];
60199
+ // make sure to include 'missing' axes here
60200
+ var allAxisIdsIncludingMissing = allAxisIds.concat(missingMatchedAxisIds);
60201
+ var axNamesIncludingMissing = axNames.concat(Lib.simpleMap(missingMatchedAxisIds, id2name));
60107
60202
 
60108
- for(i = 0; i < axNames.length; i++) {
60109
- axName = axNames[i];
60203
+ for(i = 0; i < axNamesIncludingMissing.length; i++) {
60204
+ axName = axNamesIncludingMissing[i];
60110
60205
  axLetter = axName.charAt(0);
60111
60206
  axLayoutIn = layoutIn[axName];
60112
60207
  axLayoutOut = layoutOut[axName];
@@ -60114,15 +60209,19 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) {
60114
60209
  var scaleanchorDflt;
60115
60210
  if(axLetter === 'y' && !axLayoutIn.hasOwnProperty('scaleanchor') && axHasImage[axName]) {
60116
60211
  scaleanchorDflt = axLayoutOut.anchor;
60117
- } else {scaleanchorDflt = undefined;}
60212
+ } else {
60213
+ scaleanchorDflt = undefined;
60214
+ }
60118
60215
 
60119
60216
  var constrainDflt;
60120
60217
  if(!axLayoutIn.hasOwnProperty('constrain') && axHasImage[axName]) {
60121
60218
  constrainDflt = 'domain';
60122
- } else {constrainDflt = undefined;}
60219
+ } else {
60220
+ constrainDflt = undefined;
60221
+ }
60123
60222
 
60124
60223
  handleConstraintDefaults(axLayoutIn, axLayoutOut, coerce, {
60125
- allAxisIds: allAxisIds,
60224
+ allAxisIds: allAxisIdsIncludingMissing,
60126
60225
  layoutOut: layoutOut,
60127
60226
  scaleanchorDflt: scaleanchorDflt,
60128
60227
  constrainDflt: constrainDflt
@@ -60133,7 +60232,6 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) {
60133
60232
  var group = matchGroups[i];
60134
60233
  var rng = null;
60135
60234
  var autorange = null;
60136
- var axId;
60137
60235
 
60138
60236
  // find 'matching' range attrs
60139
60237
  for(axId in group) {
@@ -60186,7 +60284,7 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) {
60186
60284
  }
60187
60285
  };
60188
60286
 
60189
- },{"../../components/color":50,"../../lib":169,"../../plot_api/plot_template":203,"../../registry":261,"../layout_attributes":243,"./axis_defaults":215,"./axis_ids":216,"./constraints":220,"./layout_attributes":225,"./position_defaults":228,"./type_defaults":236}],227:[function(_dereq_,module,exports){
60287
+ },{"../../components/color":50,"../../lib":169,"../../plot_api/plot_template":203,"../../registry":261,"../layout_attributes":243,"./axis_defaults":215,"./axis_ids":216,"./constants":219,"./constraints":220,"./layout_attributes":225,"./position_defaults":228,"./type_defaults":236}],227:[function(_dereq_,module,exports){
60190
60288
  /**
60191
60289
  * Copyright 2012-2020, Plotly, Inc.
60192
60290
  * All rights reserved.
@@ -64363,7 +64461,8 @@ function convertOpts(opts) {
64363
64461
  break;
64364
64462
  case 'raster':
64365
64463
  Lib.extendFlat(paint, {
64366
- 'raster-fade-duration': 0
64464
+ 'raster-fade-duration': 0,
64465
+ 'raster-opacity': opts.opacity
64367
64466
  });
64368
64467
  break;
64369
64468
  }
@@ -66882,10 +66981,13 @@ plots.supplyTraceDefaults = function(traceIn, traceOut, colorIndex, layout, trac
66882
66981
  var subplots = layout._subplots;
66883
66982
  var subplotId = '';
66884
66983
 
66885
- // TODO - currently if we draw an empty gl2d subplot, it draws
66886
- // nothing then gets stuck and you can't get it back without newPlot
66887
- // sort this out in the regl refactor? but for now just drop empty gl2d subplots
66888
- if(basePlotModule.name !== 'gl2d' || visible) {
66984
+ if(
66985
+ visible ||
66986
+ basePlotModule.name !== 'gl2d' // for now just drop empty gl2d subplots
66987
+ // TODO - currently if we draw an empty gl2d subplot, it draws
66988
+ // nothing then gets stuck and you can't get it back without newPlot
66989
+ // sort this out in the regl refactor?
66990
+ ) {
66889
66991
  if(Array.isArray(subplotAttr)) {
66890
66992
  for(i = 0; i < subplotAttr.length; i++) {
66891
66993
  var attri = subplotAttr[i];
@@ -68544,7 +68646,7 @@ plots.doCalcdata = function(gd, traces) {
68544
68646
  calcdata[i] = cd;
68545
68647
  }
68546
68648
 
68547
- setupAxisCategories(axList, fullData);
68649
+ setupAxisCategories(axList, fullData, fullLayout);
68548
68650
 
68549
68651
  // 'transform' loop - must calc container traces first
68550
68652
  // so that if their dependent traces can get transform properly
@@ -68552,7 +68654,7 @@ plots.doCalcdata = function(gd, traces) {
68552
68654
  for(i = 0; i < fullData.length; i++) transformCalci(i);
68553
68655
 
68554
68656
  // clear stuff that should recomputed in 'regular' loop
68555
- if(hasCalcTransform) setupAxisCategories(axList, fullData);
68657
+ if(hasCalcTransform) setupAxisCategories(axList, fullData, fullLayout);
68556
68658
 
68557
68659
  // 'regular' loop - make sure container traces (eg carpet) calc before
68558
68660
  // contained traces (eg contourcarpet)
@@ -68757,13 +68859,31 @@ function sortAxisCategoriesByValue(axList, gd) {
68757
68859
  return affectedTraces;
68758
68860
  }
68759
68861
 
68760
- function setupAxisCategories(axList, fullData) {
68761
- for(var i = 0; i < axList.length; i++) {
68762
- var ax = axList[i];
68862
+ function setupAxisCategories(axList, fullData, fullLayout) {
68863
+ var axLookup = {};
68864
+ var i, ax, axId;
68865
+
68866
+ for(i = 0; i < axList.length; i++) {
68867
+ ax = axList[i];
68868
+ axId = ax._id;
68869
+
68763
68870
  ax.clearCalc();
68764
68871
  if(ax.type === 'multicategory') {
68765
68872
  ax.setupMultiCategory(fullData);
68766
68873
  }
68874
+
68875
+ axLookup[ax._id] = 1;
68876
+ }
68877
+
68878
+ // look into match groups for 'missing' axes
68879
+ var matchGroups = fullLayout._axisMatchGroups || [];
68880
+ for(i = 0; i < matchGroups.length; i++) {
68881
+ for(axId in matchGroups[i]) {
68882
+ if(!axLookup[axId]) {
68883
+ ax = fullLayout[axisIDs.id2name(axId)];
68884
+ ax.clearCalc();
68885
+ }
68886
+ }
68767
68887
  }
68768
68888
  }
68769
68889