plotly.js 2.6.2 → 2.8.0
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/CHANGELOG.md +43 -0
- package/README.md +3 -3
- package/dist/README.md +26 -26
- package/dist/plot-schema.json +1015 -407
- package/dist/plotly-basic.js +568 -225
- package/dist/plotly-basic.min.js +4 -4
- package/dist/plotly-cartesian.js +1029 -371
- package/dist/plotly-cartesian.min.js +3 -3
- package/dist/plotly-finance.js +618 -227
- package/dist/plotly-finance.min.js +4 -4
- package/dist/plotly-geo-assets.js +2 -2
- package/dist/plotly-geo.js +564 -223
- package/dist/plotly-geo.min.js +2 -2
- package/dist/plotly-gl2d.js +580 -224
- package/dist/plotly-gl2d.min.js +2 -2
- package/dist/plotly-gl3d.js +564 -223
- package/dist/plotly-gl3d.min.js +2 -2
- package/dist/plotly-mapbox.js +570 -226
- package/dist/plotly-mapbox.min.js +2 -2
- package/dist/plotly-strict.js +1253 -592
- package/dist/plotly-strict.min.js +3 -3
- package/dist/plotly-with-meta.js +1345 -654
- package/dist/plotly.js +1307 -646
- package/dist/plotly.min.js +10 -10
- package/package.json +9 -9
- package/src/components/colorbar/attributes.js +29 -20
- package/src/components/colorbar/defaults.js +30 -8
- package/src/components/colorbar/draw.js +398 -141
- package/src/components/drawing/index.js +6 -3
- package/src/components/fx/hover.js +16 -17
- package/src/components/fx/hoverlabel_defaults.js +4 -2
- package/src/components/fx/layout_attributes.js +14 -4
- package/src/components/fx/layout_defaults.js +2 -0
- package/src/components/legend/attributes.js +7 -0
- package/src/components/legend/defaults.js +24 -7
- package/src/components/titles/index.js +8 -2
- package/src/plot_api/plot_api.js +38 -9
- package/src/plots/font_attributes.js +3 -0
- package/src/plots/layout_attributes.js +1 -0
- package/src/plots/mapbox/mapbox.js +6 -3
- package/src/plots/plots.js +7 -15
- package/src/traces/bar/plot.js +1 -1
- package/src/traces/contour/attributes.js +12 -0
- package/src/traces/contour/defaults.js +9 -1
- package/src/traces/heatmap/attributes.js +16 -0
- package/src/traces/heatmap/defaults.js +2 -0
- package/src/traces/heatmap/label_defaults.js +13 -0
- package/src/traces/heatmap/plot.js +203 -4
- package/src/traces/histogram/attributes.js +40 -0
- package/src/traces/histogram/defaults.js +11 -0
- package/src/traces/histogram2d/attributes.js +8 -0
- package/src/traces/histogram2d/defaults.js +4 -0
- package/src/traces/histogram2dcontour/attributes.js +3 -1
- package/src/traces/histogram2dcontour/defaults.js +8 -1
- package/src/traces/pie/calc.js +3 -1
- package/src/version.js +1 -1
- package/tasks/test_mock.js +1 -0
|
@@ -927,7 +927,7 @@ var TEXTOFFSETSIGN = {
|
|
|
927
927
|
start: 1, end: -1, middle: 0, bottom: 1, top: -1
|
|
928
928
|
};
|
|
929
929
|
|
|
930
|
-
function textPointPosition(s, textPosition, fontSize, markerRadius) {
|
|
930
|
+
function textPointPosition(s, textPosition, fontSize, markerRadius, dontTouchParent) {
|
|
931
931
|
var group = d3.select(s.node().parentNode);
|
|
932
932
|
|
|
933
933
|
var v = textPosition.indexOf('top') !== -1 ?
|
|
@@ -949,7 +949,9 @@ function textPointPosition(s, textPosition, fontSize, markerRadius) {
|
|
|
949
949
|
|
|
950
950
|
// fix the overall text group position
|
|
951
951
|
s.attr('text-anchor', h);
|
|
952
|
-
|
|
952
|
+
if(!dontTouchParent) {
|
|
953
|
+
group.attr('transform', strTranslate(dx, dy));
|
|
954
|
+
}
|
|
953
955
|
}
|
|
954
956
|
|
|
955
957
|
function extracTextFontSize(d, trace) {
|
|
@@ -1019,7 +1021,8 @@ drawing.selectedTextStyle = function(s, trace) {
|
|
|
1019
1021
|
var fontSize = extracTextFontSize(d, trace);
|
|
1020
1022
|
|
|
1021
1023
|
Color.fill(tx, tc);
|
|
1022
|
-
|
|
1024
|
+
var dontTouchParent = Registry.traceIs(trace, 'bar-like');
|
|
1025
|
+
textPointPosition(tx, tp, fontSize, d.mrc2 || d.mrc, dontTouchParent);
|
|
1023
1026
|
});
|
|
1024
1027
|
};
|
|
1025
1028
|
|
|
@@ -78,11 +78,13 @@ var cartesianScatterPoints = {
|
|
|
78
78
|
// The actual rendering is done by private function _hover.
|
|
79
79
|
exports.hover = function hover(gd, evt, subplot, noHoverEvent) {
|
|
80
80
|
gd = Lib.getGraphDiv(gd);
|
|
81
|
-
|
|
81
|
+
// The 'target' property changes when bubbling out of Shadow DOM.
|
|
82
|
+
// Throttling can delay reading the target, so we save the current value.
|
|
83
|
+
var eventTarget = evt.target;
|
|
82
84
|
Lib.throttle(
|
|
83
85
|
gd._fullLayout._uid + constants.HOVERID,
|
|
84
86
|
constants.HOVERMINTIME,
|
|
85
|
-
function() { _hover(gd, evt, subplot, noHoverEvent); }
|
|
87
|
+
function() { _hover(gd, evt, subplot, noHoverEvent, eventTarget); }
|
|
86
88
|
);
|
|
87
89
|
};
|
|
88
90
|
|
|
@@ -247,7 +249,7 @@ exports.loneHover = function loneHover(hoverItems, opts) {
|
|
|
247
249
|
};
|
|
248
250
|
|
|
249
251
|
// The actual implementation is here:
|
|
250
|
-
function _hover(gd, evt, subplot, noHoverEvent) {
|
|
252
|
+
function _hover(gd, evt, subplot, noHoverEvent, eventTarget) {
|
|
251
253
|
if(!subplot) subplot = 'xy';
|
|
252
254
|
|
|
253
255
|
// if the user passed in an array of subplots,
|
|
@@ -366,7 +368,7 @@ function _hover(gd, evt, subplot, noHoverEvent) {
|
|
|
366
368
|
// [x|y]px: the pixels (from top left) of the mouse location
|
|
367
369
|
// on the currently selected plot area
|
|
368
370
|
// add pointerX|Y property for drawing the spikes in spikesnap 'cursor' situation
|
|
369
|
-
var hasUserCalledHover = !
|
|
371
|
+
var hasUserCalledHover = !eventTarget;
|
|
370
372
|
var xpx, ypx;
|
|
371
373
|
|
|
372
374
|
if(hasUserCalledHover) {
|
|
@@ -383,13 +385,7 @@ function _hover(gd, evt, subplot, noHoverEvent) {
|
|
|
383
385
|
return;
|
|
384
386
|
}
|
|
385
387
|
|
|
386
|
-
|
|
387
|
-
var target = evt.composedPath && evt.composedPath()[0];
|
|
388
|
-
if(!target) {
|
|
389
|
-
// Fallback for browsers not supporting composedPath
|
|
390
|
-
target = evt.target;
|
|
391
|
-
}
|
|
392
|
-
var dbb = target.getBoundingClientRect();
|
|
388
|
+
var dbb = eventTarget.getBoundingClientRect();
|
|
393
389
|
|
|
394
390
|
xpx = evt.clientX - dbb.left;
|
|
395
391
|
ypx = evt.clientY - dbb.top;
|
|
@@ -837,15 +833,15 @@ function _hover(gd, evt, subplot, noHoverEvent) {
|
|
|
837
833
|
if(!helpers.isUnifiedHover(hovermode)) {
|
|
838
834
|
hoverAvoidOverlaps(hoverLabels, rotateLabels ? 'xa' : 'ya', fullLayout);
|
|
839
835
|
alignHoverText(hoverLabels, rotateLabels, fullLayout._invScaleX, fullLayout._invScaleY);
|
|
840
|
-
} // TODO: tagName hack is needed to appease geo.js's hack of using
|
|
836
|
+
} // TODO: tagName hack is needed to appease geo.js's hack of using eventTarget=true
|
|
841
837
|
// we should improve the "fx" API so other plots can use it without these hack.
|
|
842
|
-
if(
|
|
838
|
+
if(eventTarget && eventTarget.tagName) {
|
|
843
839
|
var hasClickToShow = Registry.getComponentMethod('annotations', 'hasClickToShow')(gd, newhoverdata);
|
|
844
|
-
overrideCursor(d3.select(
|
|
840
|
+
overrideCursor(d3.select(eventTarget), hasClickToShow ? 'pointer' : '');
|
|
845
841
|
}
|
|
846
842
|
|
|
847
843
|
// don't emit events if called manually
|
|
848
|
-
if(!
|
|
844
|
+
if(!eventTarget || noHoverEvent || !hoverChanged(gd, evt, oldhoverdata)) return;
|
|
849
845
|
|
|
850
846
|
if(oldhoverdata) {
|
|
851
847
|
gd.emit('plotly_unhover', {
|
|
@@ -1107,7 +1103,9 @@ function createHoverText(hoverData, opts) {
|
|
|
1107
1103
|
orientation: 'v'
|
|
1108
1104
|
}
|
|
1109
1105
|
};
|
|
1110
|
-
var mockLayoutOut = {
|
|
1106
|
+
var mockLayoutOut = {
|
|
1107
|
+
font: font
|
|
1108
|
+
};
|
|
1111
1109
|
legendSupplyDefaults(mockLayoutIn, mockLayoutOut, gd._fullData);
|
|
1112
1110
|
var mockLegend = mockLayoutOut.legend;
|
|
1113
1111
|
|
|
@@ -1148,7 +1146,8 @@ function createHoverText(hoverData, opts) {
|
|
|
1148
1146
|
|
|
1149
1147
|
// Draw unified hover label
|
|
1150
1148
|
mockLegend._inHover = true;
|
|
1151
|
-
mockLegend._groupTitleFont =
|
|
1149
|
+
mockLegend._groupTitleFont = hoverlabel.grouptitlefont;
|
|
1150
|
+
|
|
1152
1151
|
legendDraw(gd, mockLegend);
|
|
1153
1152
|
|
|
1154
1153
|
// Position the hover
|
|
@@ -7,9 +7,11 @@ var isUnifiedHover = require('./helpers').isUnifiedHover;
|
|
|
7
7
|
module.exports = function handleHoverLabelDefaults(contIn, contOut, coerce, opts) {
|
|
8
8
|
opts = opts || {};
|
|
9
9
|
|
|
10
|
+
var hasLegend = contOut.legend;
|
|
11
|
+
|
|
10
12
|
function inheritFontAttr(attr) {
|
|
11
13
|
if(!opts.font[attr]) {
|
|
12
|
-
opts.font[attr] =
|
|
14
|
+
opts.font[attr] = hasLegend ? contOut.legend.font[attr] : contOut.font[attr];
|
|
13
15
|
}
|
|
14
16
|
}
|
|
15
17
|
|
|
@@ -20,7 +22,7 @@ module.exports = function handleHoverLabelDefaults(contIn, contOut, coerce, opts
|
|
|
20
22
|
inheritFontAttr('family');
|
|
21
23
|
inheritFontAttr('color');
|
|
22
24
|
|
|
23
|
-
if(
|
|
25
|
+
if(hasLegend) {
|
|
24
26
|
if(!opts.bgcolor) opts.bgcolor = Color.combine(contOut.legend.bgcolor, contOut.paper_bgcolor);
|
|
25
27
|
if(!opts.bordercolor) opts.bordercolor = contOut.legend.bordercolor;
|
|
26
28
|
} else {
|
|
@@ -2,12 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
var constants = require('./constants');
|
|
4
4
|
|
|
5
|
-
var fontAttrs = require('../../plots/font_attributes')
|
|
5
|
+
var fontAttrs = require('../../plots/font_attributes');
|
|
6
|
+
|
|
7
|
+
var font = fontAttrs({
|
|
6
8
|
editType: 'none',
|
|
7
9
|
description: 'Sets the default hover label font used by all traces on the graph.'
|
|
8
10
|
});
|
|
9
|
-
|
|
10
|
-
|
|
11
|
+
font.family.dflt = constants.HOVERFONT;
|
|
12
|
+
font.size.dflt = constants.HOVERFONTSIZE;
|
|
11
13
|
|
|
12
14
|
module.exports = {
|
|
13
15
|
clickmode: {
|
|
@@ -118,7 +120,14 @@ module.exports = {
|
|
|
118
120
|
'Sets the border color of all hover labels on graph.'
|
|
119
121
|
].join(' ')
|
|
120
122
|
},
|
|
121
|
-
font:
|
|
123
|
+
font: font,
|
|
124
|
+
grouptitlefont: fontAttrs({
|
|
125
|
+
editType: 'none',
|
|
126
|
+
description: [
|
|
127
|
+
'Sets the font for group titles in hover (unified modes).',
|
|
128
|
+
'Defaults to `hoverlabel.font`.'
|
|
129
|
+
].join(' ')
|
|
130
|
+
}),
|
|
122
131
|
align: {
|
|
123
132
|
valType: 'enumerated',
|
|
124
133
|
values: ['left', 'right', 'auto'],
|
|
@@ -143,6 +152,7 @@ module.exports = {
|
|
|
143
152
|
'`namelength - 3` characters and add an ellipsis.'
|
|
144
153
|
].join(' ')
|
|
145
154
|
},
|
|
155
|
+
|
|
146
156
|
editType: 'none'
|
|
147
157
|
},
|
|
148
158
|
selectdirection: {
|
|
@@ -30,6 +30,13 @@ module.exports = {
|
|
|
30
30
|
editType: 'legend',
|
|
31
31
|
description: 'Sets the font used to text the legend items.'
|
|
32
32
|
}),
|
|
33
|
+
grouptitlefont: fontAttrs({
|
|
34
|
+
editType: 'legend',
|
|
35
|
+
description: [
|
|
36
|
+
'Sets the font for group titles in legend.',
|
|
37
|
+
'Defaults to `legend.font` with its size increased about 10%.'
|
|
38
|
+
].join(' ')
|
|
39
|
+
}),
|
|
33
40
|
orientation: {
|
|
34
41
|
valType: 'enumerated',
|
|
35
42
|
values: ['v', 'h'],
|
|
@@ -4,6 +4,7 @@ var Registry = require('../../registry');
|
|
|
4
4
|
var Lib = require('../../lib');
|
|
5
5
|
var Template = require('../../plot_api/plot_template');
|
|
6
6
|
|
|
7
|
+
var plotsAttrs = require('../../plots/attributes');
|
|
7
8
|
var attributes = require('./attributes');
|
|
8
9
|
var basePlotLayoutAttributes = require('../../plots/layout_attributes');
|
|
9
10
|
var helpers = require('./helpers');
|
|
@@ -11,13 +12,30 @@ var helpers = require('./helpers');
|
|
|
11
12
|
|
|
12
13
|
module.exports = function legendDefaults(layoutIn, layoutOut, fullData) {
|
|
13
14
|
var containerIn = layoutIn.legend || {};
|
|
15
|
+
var containerOut = Template.newContainer(layoutOut, 'legend');
|
|
16
|
+
|
|
17
|
+
function coerce(attr, dflt) {
|
|
18
|
+
return Lib.coerce(containerIn, containerOut, attributes, attr, dflt);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
var trace;
|
|
22
|
+
var traceCoerce = function(attr, dflt) {
|
|
23
|
+
var traceIn = trace._input;
|
|
24
|
+
var traceOut = trace;
|
|
25
|
+
return Lib.coerce(traceIn, traceOut, plotsAttrs, attr, dflt);
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
var globalFont = layoutOut.font || {};
|
|
29
|
+
var grouptitlefont = Lib.coerceFont(coerce, 'grouptitlefont', Lib.extendFlat({}, globalFont, {
|
|
30
|
+
size: Math.round(globalFont.size * 1.1)
|
|
31
|
+
}));
|
|
14
32
|
|
|
15
33
|
var legendTraceCount = 0;
|
|
16
34
|
var legendReallyHasATrace = false;
|
|
17
35
|
var defaultOrder = 'normal';
|
|
18
36
|
|
|
19
37
|
for(var i = 0; i < fullData.length; i++) {
|
|
20
|
-
|
|
38
|
+
trace = fullData[i];
|
|
21
39
|
|
|
22
40
|
if(!trace.visible) continue;
|
|
23
41
|
|
|
@@ -44,6 +62,8 @@ module.exports = function legendDefaults(layoutIn, layoutOut, fullData) {
|
|
|
44
62
|
legendTraceCount++;
|
|
45
63
|
}
|
|
46
64
|
}
|
|
65
|
+
|
|
66
|
+
Lib.coerceFont(traceCoerce, 'legendgrouptitle.font', grouptitlefont);
|
|
47
67
|
}
|
|
48
68
|
|
|
49
69
|
if((Registry.traceIs(trace, 'bar') && layoutOut.barmode === 'stack') ||
|
|
@@ -62,13 +82,10 @@ module.exports = function legendDefaults(layoutIn, layoutOut, fullData) {
|
|
|
62
82
|
basePlotLayoutAttributes, 'showlegend',
|
|
63
83
|
legendReallyHasATrace && legendTraceCount > 1);
|
|
64
84
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
var containerOut = Template.newContainer(layoutOut, 'legend');
|
|
85
|
+
// delete legend
|
|
86
|
+
if(showLegend === false) layoutOut.legend = undefined;
|
|
68
87
|
|
|
69
|
-
|
|
70
|
-
return Lib.coerce(containerIn, containerOut, attributes, attr, dflt);
|
|
71
|
-
}
|
|
88
|
+
if(showLegend === false && !containerIn.uirevision) return;
|
|
72
89
|
|
|
73
90
|
coerce('uirevision', layoutOut.uirevision);
|
|
74
91
|
|
|
@@ -96,8 +96,10 @@ function draw(gd, titleClass, options) {
|
|
|
96
96
|
|
|
97
97
|
var elShouldExist = txt || editable;
|
|
98
98
|
|
|
99
|
+
var hColorbarMoveTitle;
|
|
99
100
|
if(!group) {
|
|
100
101
|
group = Lib.ensureSingle(fullLayout._infolayer, 'g', 'g-' + titleClass);
|
|
102
|
+
hColorbarMoveTitle = fullLayout._hColorbarMoveTitle;
|
|
101
103
|
}
|
|
102
104
|
|
|
103
105
|
var el = group.selectAll('text')
|
|
@@ -121,13 +123,17 @@ function draw(gd, titleClass, options) {
|
|
|
121
123
|
function drawTitle(titleEl) {
|
|
122
124
|
var transformVal;
|
|
123
125
|
|
|
126
|
+
if(!transform && hColorbarMoveTitle) {
|
|
127
|
+
transform = {};
|
|
128
|
+
}
|
|
129
|
+
|
|
124
130
|
if(transform) {
|
|
125
131
|
transformVal = '';
|
|
126
132
|
if(transform.rotate) {
|
|
127
133
|
transformVal += 'rotate(' + [transform.rotate, attributes.x, attributes.y] + ')';
|
|
128
134
|
}
|
|
129
|
-
if(transform.offset) {
|
|
130
|
-
transformVal += strTranslate(0, transform.offset);
|
|
135
|
+
if(transform.offset || hColorbarMoveTitle) {
|
|
136
|
+
transformVal += strTranslate(0, (transform.offset || 0) - (hColorbarMoveTitle || 0));
|
|
131
137
|
}
|
|
132
138
|
} else {
|
|
133
139
|
transformVal = null;
|
package/src/plot_api/plot_api.js
CHANGED
|
@@ -1719,7 +1719,7 @@ function cleanDeprecatedAttributeKeys(aobj) {
|
|
|
1719
1719
|
if((key === 'title' || oldAxisTitleRegex.test(key) || colorbarRegex.test(key)) &&
|
|
1720
1720
|
(typeof value === 'string' || typeof value === 'number')) {
|
|
1721
1721
|
replace(key, key.replace('title', 'title.text'));
|
|
1722
|
-
} else if(key.indexOf('titlefont') > -1) {
|
|
1722
|
+
} else if(key.indexOf('titlefont') > -1 && key.indexOf('grouptitlefont') === -1) {
|
|
1723
1723
|
replace(key, key.replace('titlefont', 'title.font'));
|
|
1724
1724
|
} else if(key.indexOf('titleposition') > -1) {
|
|
1725
1725
|
replace(key, key.replace('titleposition', 'title.position'));
|
|
@@ -2396,7 +2396,8 @@ function findUIPattern(key, patternSpecs) {
|
|
|
2396
2396
|
var spec = patternSpecs[i];
|
|
2397
2397
|
var match = key.match(spec.pattern);
|
|
2398
2398
|
if(match) {
|
|
2399
|
-
|
|
2399
|
+
var head = match[1] || '';
|
|
2400
|
+
return {head: head, tail: key.substr(head.length + 1), attr: spec.attr};
|
|
2400
2401
|
}
|
|
2401
2402
|
}
|
|
2402
2403
|
}
|
|
@@ -2448,26 +2449,54 @@ function valsMatch(v1, v2) {
|
|
|
2448
2449
|
|
|
2449
2450
|
function applyUIRevisions(data, layout, oldFullData, oldFullLayout) {
|
|
2450
2451
|
var layoutPreGUI = oldFullLayout._preGUI;
|
|
2451
|
-
var key, revAttr, oldRev, newRev, match, preGUIVal, newNP, newVal;
|
|
2452
|
+
var key, revAttr, oldRev, newRev, match, preGUIVal, newNP, newVal, head, tail;
|
|
2452
2453
|
var bothInheritAutorange = [];
|
|
2454
|
+
var newAutorangeIn = {};
|
|
2453
2455
|
var newRangeAccepted = {};
|
|
2454
2456
|
for(key in layoutPreGUI) {
|
|
2455
2457
|
match = findUIPattern(key, layoutUIControlPatterns);
|
|
2456
2458
|
if(match) {
|
|
2457
|
-
|
|
2459
|
+
head = match.head;
|
|
2460
|
+
tail = match.tail;
|
|
2461
|
+
revAttr = match.attr || (head + '.uirevision');
|
|
2458
2462
|
oldRev = nestedProperty(oldFullLayout, revAttr).get();
|
|
2459
2463
|
newRev = oldRev && getNewRev(revAttr, layout);
|
|
2464
|
+
|
|
2460
2465
|
if(newRev && (newRev === oldRev)) {
|
|
2461
2466
|
preGUIVal = layoutPreGUI[key];
|
|
2462
2467
|
if(preGUIVal === null) preGUIVal = undefined;
|
|
2463
2468
|
newNP = nestedProperty(layout, key);
|
|
2464
2469
|
newVal = newNP.get();
|
|
2470
|
+
|
|
2465
2471
|
if(valsMatch(newVal, preGUIVal)) {
|
|
2466
|
-
if(newVal === undefined &&
|
|
2467
|
-
bothInheritAutorange.push(
|
|
2472
|
+
if(newVal === undefined && tail === 'autorange') {
|
|
2473
|
+
bothInheritAutorange.push(head);
|
|
2468
2474
|
}
|
|
2469
2475
|
newNP.set(undefinedToNull(nestedProperty(oldFullLayout, key).get()));
|
|
2470
2476
|
continue;
|
|
2477
|
+
} else if(tail === 'autorange' || tail.substr(0, 6) === 'range[') {
|
|
2478
|
+
// Special case for (auto)range since we push it back into the layout
|
|
2479
|
+
// so all null should be treated equivalently to autorange: true with any range
|
|
2480
|
+
var pre0 = layoutPreGUI[head + '.range[0]'];
|
|
2481
|
+
var pre1 = layoutPreGUI[head + '.range[1]'];
|
|
2482
|
+
var preAuto = layoutPreGUI[head + '.autorange'];
|
|
2483
|
+
if(preAuto || (preAuto === null && pre0 === null && pre1 === null)) {
|
|
2484
|
+
// Only read the input layout once and stash the result,
|
|
2485
|
+
// so we get it before we start modifying it
|
|
2486
|
+
if(!(head in newAutorangeIn)) {
|
|
2487
|
+
var newContainer = nestedProperty(layout, head).get();
|
|
2488
|
+
newAutorangeIn[head] = newContainer && (
|
|
2489
|
+
newContainer.autorange ||
|
|
2490
|
+
(newContainer.autorange !== false && (
|
|
2491
|
+
!newContainer.range || newContainer.range.length !== 2)
|
|
2492
|
+
)
|
|
2493
|
+
);
|
|
2494
|
+
}
|
|
2495
|
+
if(newAutorangeIn[head]) {
|
|
2496
|
+
newNP.set(undefinedToNull(nestedProperty(oldFullLayout, key).get()));
|
|
2497
|
+
continue;
|
|
2498
|
+
}
|
|
2499
|
+
}
|
|
2471
2500
|
}
|
|
2472
2501
|
}
|
|
2473
2502
|
} else {
|
|
@@ -2478,12 +2507,12 @@ function applyUIRevisions(data, layout, oldFullData, oldFullLayout) {
|
|
|
2478
2507
|
// so remove it from _preGUI for next time.
|
|
2479
2508
|
delete layoutPreGUI[key];
|
|
2480
2509
|
|
|
2481
|
-
if(
|
|
2482
|
-
newRangeAccepted[
|
|
2510
|
+
if(match && match.tail.substr(0, 6) === 'range[') {
|
|
2511
|
+
newRangeAccepted[match.head] = 1;
|
|
2483
2512
|
}
|
|
2484
2513
|
}
|
|
2485
2514
|
|
|
2486
|
-
//
|
|
2515
|
+
// More special logic for `autorange`, since it interacts with `range`:
|
|
2487
2516
|
// If the new figure's matching `range` was kept, and `autorange`
|
|
2488
2517
|
// wasn't supplied explicitly in either the original or the new figure,
|
|
2489
2518
|
// we shouldn't alter that - but we may just have done that, so fix it.
|
|
@@ -53,6 +53,9 @@ module.exports = function(opts) {
|
|
|
53
53
|
description: '' + (opts.description || '') + ''
|
|
54
54
|
};
|
|
55
55
|
|
|
56
|
+
if(opts.autoSize) attrs.size.dflt = 'auto';
|
|
57
|
+
if(opts.autoColor) attrs.color.dflt = 'auto';
|
|
58
|
+
|
|
56
59
|
if(opts.arrayOk) {
|
|
57
60
|
attrs.family.arrayOk = true;
|
|
58
61
|
attrs.size.arrayOk = true;
|
|
@@ -722,11 +722,14 @@ proto.project = function(v) {
|
|
|
722
722
|
proto.getView = function() {
|
|
723
723
|
var map = this.map;
|
|
724
724
|
var mapCenter = map.getCenter();
|
|
725
|
-
var
|
|
725
|
+
var lon = mapCenter.lng;
|
|
726
|
+
var lat = mapCenter.lat;
|
|
727
|
+
var center = { lon: lon, lat: lat };
|
|
726
728
|
|
|
727
729
|
var canvas = map.getCanvas();
|
|
728
|
-
var w = canvas.width;
|
|
729
|
-
var h = canvas.height;
|
|
730
|
+
var w = parseInt(canvas.style.width);
|
|
731
|
+
var h = parseInt(canvas.style.height);
|
|
732
|
+
|
|
730
733
|
return {
|
|
731
734
|
center: center,
|
|
732
735
|
zoom: map.getZoom(),
|
package/src/plots/plots.js
CHANGED
|
@@ -1321,13 +1321,7 @@ plots.supplyTraceDefaults = function(traceIn, traceOut, colorIndex, layout, trac
|
|
|
1321
1321
|
);
|
|
1322
1322
|
|
|
1323
1323
|
coerce('legendgroup');
|
|
1324
|
-
|
|
1325
|
-
if(titleText) {
|
|
1326
|
-
Lib.coerceFont(coerce, 'legendgrouptitle.font', Lib.extendFlat({}, layout.font, {
|
|
1327
|
-
size: Math.round(layout.font.size * 1.1) // default to larger font size
|
|
1328
|
-
}));
|
|
1329
|
-
}
|
|
1330
|
-
|
|
1324
|
+
coerce('legendgrouptitle.text');
|
|
1331
1325
|
coerce('legendrank');
|
|
1332
1326
|
|
|
1333
1327
|
traceOut._dfltShowLegend = true;
|
|
@@ -1475,16 +1469,14 @@ plots.supplyLayoutGlobalDefaults = function(layoutIn, layoutOut, formatObj) {
|
|
|
1475
1469
|
|
|
1476
1470
|
coerce('autotypenumbers');
|
|
1477
1471
|
|
|
1478
|
-
var
|
|
1479
|
-
|
|
1480
|
-
coerce('title.text', layoutOut._dfltTitle.plot);
|
|
1472
|
+
var font = Lib.coerceFont(coerce, 'font');
|
|
1473
|
+
var fontSize = font.size;
|
|
1481
1474
|
|
|
1482
|
-
Lib.coerceFont(coerce, 'title.font', {
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
color: globalFont.color
|
|
1486
|
-
});
|
|
1475
|
+
Lib.coerceFont(coerce, 'title.font', Lib.extendFlat({}, font, {
|
|
1476
|
+
size: Math.round(fontSize * 1.4)
|
|
1477
|
+
}));
|
|
1487
1478
|
|
|
1479
|
+
coerce('title.text', layoutOut._dfltTitle.plot);
|
|
1488
1480
|
coerce('title.xref');
|
|
1489
1481
|
coerce('title.yref');
|
|
1490
1482
|
coerce('title.x');
|
package/src/traces/bar/plot.js
CHANGED
|
@@ -428,7 +428,7 @@ function appendBarText(gd, plotinfo, bar, cd, i, x0, x1, y0, y1, opts, makeOnCom
|
|
|
428
428
|
}
|
|
429
429
|
|
|
430
430
|
transform.fontSize = font.size;
|
|
431
|
-
recordMinTextSize(trace.type, transform, fullLayout);
|
|
431
|
+
recordMinTextSize(trace.type === 'histogram' ? 'bar' : trace.type, transform, fullLayout);
|
|
432
432
|
calcBar.transform = transform;
|
|
433
433
|
|
|
434
434
|
transition(textSelection, fullLayout, opts, makeOnCompleteCallback)
|
|
@@ -42,6 +42,18 @@ module.exports = extendFlat({
|
|
|
42
42
|
yhoverformat: axisHoverFormat('y'),
|
|
43
43
|
zhoverformat: axisHoverFormat('z', 1),
|
|
44
44
|
hovertemplate: heatmapAttrs.hovertemplate,
|
|
45
|
+
texttemplate: extendFlat({}, heatmapAttrs.texttemplate, {
|
|
46
|
+
description: [
|
|
47
|
+
'For this trace it only has an effect if `coloring` is set to *heatmap*.',
|
|
48
|
+
heatmapAttrs.texttemplate.description
|
|
49
|
+
].join(' ')
|
|
50
|
+
}),
|
|
51
|
+
textfont: extendFlat({}, heatmapAttrs.textfont, {
|
|
52
|
+
description: [
|
|
53
|
+
'For this trace it only has an effect if `coloring` is set to *heatmap*.',
|
|
54
|
+
heatmapAttrs.textfont.description
|
|
55
|
+
].join(' ')
|
|
56
|
+
}),
|
|
45
57
|
hoverongaps: heatmapAttrs.hoverongaps,
|
|
46
58
|
connectgaps: extendFlat({}, heatmapAttrs.connectgaps, {
|
|
47
59
|
description: [
|
|
@@ -7,6 +7,7 @@ var handlePeriodDefaults = require('../scatter/period_defaults');
|
|
|
7
7
|
var handleConstraintDefaults = require('./constraint_defaults');
|
|
8
8
|
var handleContoursDefaults = require('./contours_defaults');
|
|
9
9
|
var handleStyleDefaults = require('./style_defaults');
|
|
10
|
+
var handleHeatmapLabelDefaults = require('../heatmap/label_defaults');
|
|
10
11
|
var attributes = require('./attributes');
|
|
11
12
|
|
|
12
13
|
|
|
@@ -31,8 +32,8 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
|
|
|
31
32
|
|
|
32
33
|
coerce('text');
|
|
33
34
|
coerce('hovertext');
|
|
34
|
-
coerce('hovertemplate');
|
|
35
35
|
coerce('hoverongaps');
|
|
36
|
+
coerce('hovertemplate');
|
|
36
37
|
|
|
37
38
|
var isConstraint = (coerce('contours.type') === 'constraint');
|
|
38
39
|
coerce('connectgaps', Lib.isArray1D(traceOut.z));
|
|
@@ -43,4 +44,11 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
|
|
|
43
44
|
handleContoursDefaults(traceIn, traceOut, coerce, coerce2);
|
|
44
45
|
handleStyleDefaults(traceIn, traceOut, coerce, layout);
|
|
45
46
|
}
|
|
47
|
+
|
|
48
|
+
if(
|
|
49
|
+
traceOut.contours &&
|
|
50
|
+
traceOut.contours.coloring === 'heatmap'
|
|
51
|
+
) {
|
|
52
|
+
handleHeatmapLabelDefaults(coerce, layout);
|
|
53
|
+
}
|
|
46
54
|
};
|
|
@@ -2,8 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
var scatterAttrs = require('../scatter/attributes');
|
|
4
4
|
var baseAttrs = require('../../plots/attributes');
|
|
5
|
+
var fontAttrs = require('../../plots/font_attributes');
|
|
5
6
|
var axisHoverFormat = require('../../plots/cartesian/axis_format_attributes').axisHoverFormat;
|
|
6
7
|
var hovertemplateAttrs = require('../../plots/template_attributes').hovertemplateAttrs;
|
|
8
|
+
var texttemplateAttrs = require('../../plots/template_attributes').texttemplateAttrs;
|
|
7
9
|
var colorScaleAttrs = require('../../components/colorscale/attributes');
|
|
8
10
|
|
|
9
11
|
var extendFlat = require('../../lib/extend').extendFlat;
|
|
@@ -116,6 +118,20 @@ module.exports = extendFlat({
|
|
|
116
118
|
zhoverformat: axisHoverFormat('z', 1),
|
|
117
119
|
|
|
118
120
|
hovertemplate: hovertemplateAttrs(),
|
|
121
|
+
texttemplate: texttemplateAttrs({
|
|
122
|
+
arrayOk: false,
|
|
123
|
+
editType: 'plot'
|
|
124
|
+
}, {
|
|
125
|
+
keys: ['x', 'y', 'z', 'text']
|
|
126
|
+
}),
|
|
127
|
+
textfont: fontAttrs({
|
|
128
|
+
editType: 'plot',
|
|
129
|
+
autoSize: true,
|
|
130
|
+
autoColor: true,
|
|
131
|
+
colorEditType: 'style',
|
|
132
|
+
description: 'Sets the text font.'
|
|
133
|
+
}),
|
|
134
|
+
|
|
119
135
|
showlegend: extendFlat({}, baseAttrs.showlegend, {dflt: false})
|
|
120
136
|
}, {
|
|
121
137
|
transforms: undefined
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
var Lib = require('../../lib');
|
|
4
4
|
|
|
5
5
|
var handleXYZDefaults = require('./xyz_defaults');
|
|
6
|
+
var handleHeatmapLabelDefaults = require('./label_defaults');
|
|
6
7
|
var handlePeriodDefaults = require('../scatter/period_defaults');
|
|
7
8
|
var handleStyleDefaults = require('./style_defaults');
|
|
8
9
|
var colorscaleDefaults = require('../../components/colorscale/defaults');
|
|
@@ -28,6 +29,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
|
|
|
28
29
|
coerce('hovertext');
|
|
29
30
|
coerce('hovertemplate');
|
|
30
31
|
|
|
32
|
+
handleHeatmapLabelDefaults(coerce, layout);
|
|
31
33
|
handleStyleDefaults(traceIn, traceOut, coerce, layout);
|
|
32
34
|
|
|
33
35
|
coerce('hoverongaps');
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var Lib = require('../../lib');
|
|
4
|
+
|
|
5
|
+
module.exports = function handleHeatmapLabelDefaults(coerce, layout) {
|
|
6
|
+
coerce('texttemplate');
|
|
7
|
+
|
|
8
|
+
var fontDflt = Lib.extendFlat({}, layout.font, {
|
|
9
|
+
color: 'auto',
|
|
10
|
+
size: 'auto'
|
|
11
|
+
});
|
|
12
|
+
Lib.coerceFont(coerce, 'textfont', fontDflt);
|
|
13
|
+
};
|