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.
Files changed (57) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/README.md +3 -3
  3. package/dist/README.md +26 -26
  4. package/dist/plot-schema.json +1015 -407
  5. package/dist/plotly-basic.js +568 -225
  6. package/dist/plotly-basic.min.js +4 -4
  7. package/dist/plotly-cartesian.js +1029 -371
  8. package/dist/plotly-cartesian.min.js +3 -3
  9. package/dist/plotly-finance.js +618 -227
  10. package/dist/plotly-finance.min.js +4 -4
  11. package/dist/plotly-geo-assets.js +2 -2
  12. package/dist/plotly-geo.js +564 -223
  13. package/dist/plotly-geo.min.js +2 -2
  14. package/dist/plotly-gl2d.js +580 -224
  15. package/dist/plotly-gl2d.min.js +2 -2
  16. package/dist/plotly-gl3d.js +564 -223
  17. package/dist/plotly-gl3d.min.js +2 -2
  18. package/dist/plotly-mapbox.js +570 -226
  19. package/dist/plotly-mapbox.min.js +2 -2
  20. package/dist/plotly-strict.js +1253 -592
  21. package/dist/plotly-strict.min.js +3 -3
  22. package/dist/plotly-with-meta.js +1345 -654
  23. package/dist/plotly.js +1307 -646
  24. package/dist/plotly.min.js +10 -10
  25. package/package.json +9 -9
  26. package/src/components/colorbar/attributes.js +29 -20
  27. package/src/components/colorbar/defaults.js +30 -8
  28. package/src/components/colorbar/draw.js +398 -141
  29. package/src/components/drawing/index.js +6 -3
  30. package/src/components/fx/hover.js +16 -17
  31. package/src/components/fx/hoverlabel_defaults.js +4 -2
  32. package/src/components/fx/layout_attributes.js +14 -4
  33. package/src/components/fx/layout_defaults.js +2 -0
  34. package/src/components/legend/attributes.js +7 -0
  35. package/src/components/legend/defaults.js +24 -7
  36. package/src/components/titles/index.js +8 -2
  37. package/src/plot_api/plot_api.js +38 -9
  38. package/src/plots/font_attributes.js +3 -0
  39. package/src/plots/layout_attributes.js +1 -0
  40. package/src/plots/mapbox/mapbox.js +6 -3
  41. package/src/plots/plots.js +7 -15
  42. package/src/traces/bar/plot.js +1 -1
  43. package/src/traces/contour/attributes.js +12 -0
  44. package/src/traces/contour/defaults.js +9 -1
  45. package/src/traces/heatmap/attributes.js +16 -0
  46. package/src/traces/heatmap/defaults.js +2 -0
  47. package/src/traces/heatmap/label_defaults.js +13 -0
  48. package/src/traces/heatmap/plot.js +203 -4
  49. package/src/traces/histogram/attributes.js +40 -0
  50. package/src/traces/histogram/defaults.js +11 -0
  51. package/src/traces/histogram2d/attributes.js +8 -0
  52. package/src/traces/histogram2d/defaults.js +4 -0
  53. package/src/traces/histogram2dcontour/attributes.js +3 -1
  54. package/src/traces/histogram2dcontour/defaults.js +8 -1
  55. package/src/traces/pie/calc.js +3 -1
  56. package/src/version.js +1 -1
  57. package/tasks/test_mock.js +1 -0
@@ -4,9 +4,27 @@ var d3 = require('@plotly/d3');
4
4
  var tinycolor = require('tinycolor2');
5
5
 
6
6
  var Registry = require('../../registry');
7
+ var Drawing = require('../../components/drawing');
8
+ var Axes = require('../../plots/cartesian/axes');
7
9
  var Lib = require('../../lib');
10
+ var svgTextUtils = require('../../lib/svg_text_utils');
11
+ var formatLabels = require('../scatter/format_labels');
12
+ var Color = require('../../components/color');
13
+ var extractOpts = require('../../components/colorscale').extractOpts;
8
14
  var makeColorScaleFuncFromTrace = require('../../components/colorscale').makeColorScaleFuncFromTrace;
9
15
  var xmlnsNamespaces = require('../../constants/xmlns_namespaces');
16
+ var alignmentConstants = require('../../constants/alignment');
17
+ var LINE_SPACING = alignmentConstants.LINE_SPACING;
18
+
19
+ var labelClass = 'heatmap-label';
20
+
21
+ function selectLabels(plotGroup) {
22
+ return plotGroup.selectAll('g.' + labelClass);
23
+ }
24
+
25
+ function removeLabels(plotGroup) {
26
+ selectLabels(plotGroup).remove();
27
+ }
10
28
 
11
29
  module.exports = function(gd, plotinfo, cdheatmaps, heatmapLayer) {
12
30
  var xa = plotinfo.xaxis;
@@ -16,6 +34,8 @@ module.exports = function(gd, plotinfo, cdheatmaps, heatmapLayer) {
16
34
  var plotGroup = d3.select(this);
17
35
  var cd0 = cd[0];
18
36
  var trace = cd0.trace;
37
+ var xGap = trace.xgap || 0;
38
+ var yGap = trace.ygap || 0;
19
39
 
20
40
  var z = cd0.z;
21
41
  var x = cd0.x;
@@ -31,7 +51,7 @@ module.exports = function(gd, plotinfo, cdheatmaps, heatmapLayer) {
31
51
  var xrev = false;
32
52
  var yrev = false;
33
53
 
34
- var left, right, temp, top, bottom, i;
54
+ var left, right, temp, top, bottom, i, j, k;
35
55
 
36
56
  // TODO: if there are multiple overlapping categorical heatmaps,
37
57
  // or if we allow category sorting, then the categories may not be
@@ -112,6 +132,8 @@ module.exports = function(gd, plotinfo, cdheatmaps, heatmapLayer) {
112
132
  if(isOffScreen) {
113
133
  var noImage = plotGroup.selectAll('image').data([]);
114
134
  noImage.exit().remove();
135
+
136
+ removeLabels(plotGroup);
115
137
  return;
116
138
  }
117
139
 
@@ -167,7 +189,7 @@ module.exports = function(gd, plotinfo, cdheatmaps, heatmapLayer) {
167
189
  var gcount = 0;
168
190
  var bcount = 0;
169
191
 
170
- var xb, j, xi, v, row, c;
192
+ var xb, xi, v, row, c;
171
193
 
172
194
  function setColor(v, pixsize) {
173
195
  if(v !== undefined) {
@@ -278,8 +300,6 @@ module.exports = function(gd, plotinfo, cdheatmaps, heatmapLayer) {
278
300
  } else { // zsmooth = false -> filling potentially large bricks works fastest with fillRect
279
301
  // gaps do not need to be exact integers, but if they *are* we will get
280
302
  // cleaner edges by rounding at least one edge
281
- var xGap = trace.xgap;
282
- var yGap = trace.ygap;
283
303
  var xGapLeft = Math.floor(xGap / 2);
284
304
  var yGapTop = Math.floor(yGap / 2);
285
305
 
@@ -332,6 +352,185 @@ module.exports = function(gd, plotinfo, cdheatmaps, heatmapLayer) {
332
352
  y: top,
333
353
  'xlink:href': canvas.toDataURL('image/png')
334
354
  });
355
+
356
+ removeLabels(plotGroup);
357
+
358
+ var texttemplate = trace.texttemplate;
359
+ if(texttemplate) {
360
+ // dummy axis for formatting the z value
361
+ var cOpts = extractOpts(trace);
362
+ var dummyAx = {
363
+ type: 'linear',
364
+ range: [cOpts.min, cOpts.max],
365
+ _separators: xa._separators,
366
+ _numFormat: xa._numFormat
367
+ };
368
+
369
+ var aHistogram2dContour = trace.type === 'histogram2dcontour';
370
+ var aContour = trace.type === 'contour';
371
+ var iStart = aContour ? 1 : 0;
372
+ var iStop = aContour ? m - 1 : m;
373
+ var jStart = aContour ? 1 : 0;
374
+ var jStop = aContour ? n - 1 : n;
375
+
376
+ var textData = [];
377
+ for(i = iStart; i < iStop; i++) {
378
+ var yVal;
379
+ if(aContour) {
380
+ yVal = cd0.y[i];
381
+ } else if(aHistogram2dContour) {
382
+ if(i === 0 || i === m - 1) continue;
383
+ yVal = cd0.y[i];
384
+ } else if(cd0.yCenter) {
385
+ yVal = cd0.yCenter[i];
386
+ } else {
387
+ if(i + 1 === m && cd0.y[i + 1] === undefined) continue;
388
+ yVal = (cd0.y[i] + cd0.y[i + 1]) / 2;
389
+ }
390
+
391
+ var _y = Math.round(ya.c2p(yVal));
392
+ if(0 > _y || _y > ya._length) continue;
393
+
394
+ for(j = jStart; j < jStop; j++) {
395
+ var xVal;
396
+ if(aContour) {
397
+ xVal = cd0.x[j];
398
+ } else if(aHistogram2dContour) {
399
+ if(j === 0 || j === n - 1) continue;
400
+ xVal = cd0.x[j];
401
+ } else if(cd0.xCenter) {
402
+ xVal = cd0.xCenter[j];
403
+ } else {
404
+ if(j + 1 === n && cd0.x[j + 1] === undefined) continue;
405
+ xVal = (cd0.x[j] + cd0.x[j + 1]) / 2;
406
+ }
407
+
408
+ var _x = Math.round(xa.c2p(xVal));
409
+ if(0 > _x || _x > xa._length) continue;
410
+
411
+ var obj = formatLabels({
412
+ x: xVal,
413
+ y: yVal
414
+ }, trace, gd._fullLayout);
415
+
416
+ obj.x = xVal;
417
+ obj.y = yVal;
418
+
419
+ var zVal = cd0.z[i][j];
420
+ if(zVal === undefined) {
421
+ obj.z = '';
422
+ obj.zLabel = '';
423
+ } else {
424
+ obj.z = zVal;
425
+ obj.zLabel = Axes.tickText(dummyAx, zVal, 'hover').text;
426
+ }
427
+
428
+ var theText = cd0.text && cd0.text[i] && cd0.text[i][j];
429
+ if(theText === undefined || theText === false) theText = '';
430
+ obj.text = theText;
431
+
432
+ var _t = Lib.texttemplateString(texttemplate, obj, gd._fullLayout._d3locale, obj, trace._meta || {});
433
+ if(!_t) continue;
434
+
435
+ var lines = _t.split('<br>');
436
+ var nL = lines.length;
437
+ var nC = 0;
438
+ for(k = 0; k < nL; k++) {
439
+ nC = Math.max(nC, lines[k].length);
440
+ }
441
+
442
+ textData.push({
443
+ l: nL, // number of lines
444
+ c: nC, // maximum number of chars in a line
445
+ t: _t, // text
446
+ x: _x,
447
+ y: _y,
448
+ z: zVal
449
+ });
450
+ }
451
+ }
452
+
453
+ var font = trace.textfont;
454
+ var fontFamily = font.family;
455
+ var fontSize = font.size;
456
+
457
+ if(!fontSize || fontSize === 'auto') {
458
+ var minW = Infinity;
459
+ var minH = Infinity;
460
+ var maxL = 0;
461
+ var maxC = 0;
462
+
463
+ for(k = 0; k < textData.length; k++) {
464
+ var d = textData[k];
465
+ maxL = Math.max(maxL, d.l);
466
+ maxC = Math.max(maxC, d.c);
467
+
468
+ if(k < textData.length - 1) {
469
+ var nextD = textData[k + 1];
470
+ var dx = Math.abs(nextD.x - d.x);
471
+ var dy = Math.abs(nextD.y - d.y);
472
+
473
+ if(dx) minW = Math.min(minW, dx);
474
+ if(dy) minH = Math.min(minH, dy);
475
+ }
476
+ }
477
+
478
+ if(
479
+ !isFinite(minW) ||
480
+ !isFinite(minH)
481
+ ) {
482
+ fontSize = 12;
483
+ } else {
484
+ minW -= xGap;
485
+ minH -= yGap;
486
+
487
+ minW /= maxC;
488
+ minH /= maxL;
489
+
490
+ minW /= LINE_SPACING / 2;
491
+ minH /= LINE_SPACING;
492
+
493
+ fontSize = Math.min(
494
+ Math.floor(minW),
495
+ Math.floor(minH)
496
+ );
497
+ }
498
+ }
499
+ if(fontSize <= 0 || !isFinite(fontSize)) return;
500
+
501
+ var xFn = function(d) { return d.x; };
502
+ var yFn = function(d) {
503
+ return d.y - fontSize * ((d.l * LINE_SPACING) / 2 - 1);
504
+ };
505
+
506
+ var labels = selectLabels(plotGroup).data(textData);
507
+
508
+ labels
509
+ .enter()
510
+ .append('g')
511
+ .classed(labelClass, 1)
512
+ .append('text')
513
+ .attr('text-anchor', 'middle')
514
+ .each(function(d) {
515
+ var thisLabel = d3.select(this);
516
+
517
+ var fontColor = font.color;
518
+ if(!fontColor || fontColor === 'auto') {
519
+ fontColor = Color.contrast(
520
+ 'rgba(' +
521
+ sclFunc(d.z).join() +
522
+ ')'
523
+ );
524
+ }
525
+
526
+ thisLabel
527
+ .attr('data-notex', 1)
528
+ .call(svgTextUtils.positionText, xFn(d), yFn(d))
529
+ .call(Drawing.font, fontFamily, fontSize, fontColor)
530
+ .text(d.t)
531
+ .call(svgTextUtils.convertToTspans, gd);
532
+ });
533
+ }
335
534
  });
336
535
  };
337
536
 
@@ -3,6 +3,8 @@
3
3
  var barAttrs = require('../bar/attributes');
4
4
  var axisHoverFormat = require('../../plots/cartesian/axis_format_attributes').axisHoverFormat;
5
5
  var hovertemplateAttrs = require('../../plots/template_attributes').hovertemplateAttrs;
6
+ var texttemplateAttrs = require('../../plots/template_attributes').texttemplateAttrs;
7
+ var fontAttrs = require('../../plots/font_attributes');
6
8
  var makeBinAttrs = require('./bin_attributes');
7
9
  var constants = require('./constants');
8
10
  var extendFlat = require('../../lib/extend').extendFlat;
@@ -198,6 +200,44 @@ module.exports = {
198
200
  keys: constants.eventDataKeys
199
201
  }),
200
202
 
203
+ texttemplate: texttemplateAttrs({
204
+ arrayOk: false,
205
+ editType: 'plot'
206
+ }, {
207
+ keys: ['label', 'value']
208
+ }),
209
+
210
+ textposition: extendFlat({}, barAttrs.textposition, {
211
+ arrayOk: false
212
+ }),
213
+
214
+ textfont: fontAttrs({
215
+ arrayOk: false,
216
+ editType: 'plot',
217
+ colorEditType: 'style',
218
+ description: 'Sets the text font.'
219
+ }),
220
+
221
+ outsidetextfont: fontAttrs({
222
+ arrayOk: false,
223
+ editType: 'plot',
224
+ colorEditType: 'style',
225
+ description: 'Sets the font used for `text` lying outside the bar.'
226
+ }),
227
+
228
+ insidetextfont: fontAttrs({
229
+ arrayOk: false,
230
+ editType: 'plot',
231
+ colorEditType: 'style',
232
+ description: 'Sets the font used for `text` lying inside the bar.'
233
+ }),
234
+
235
+ insidetextanchor: barAttrs.insidetextanchor,
236
+
237
+ textangle: barAttrs.textangle,
238
+ cliponaxis: barAttrs.cliponaxis,
239
+ constraintext: barAttrs.constraintext,
240
+
201
241
  marker: barAttrs.marker,
202
242
 
203
243
  offsetgroup: barAttrs.offsetgroup,
@@ -4,6 +4,7 @@ var Registry = require('../../registry');
4
4
  var Lib = require('../../lib');
5
5
  var Color = require('../../components/color');
6
6
 
7
+ var handleText = require('../bar/defaults').handleText;
7
8
  var handleStyleDefaults = require('../bar/style_defaults');
8
9
  var attributes = require('./attributes');
9
10
 
@@ -22,6 +23,16 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
22
23
  }
23
24
 
24
25
  coerce('text');
26
+ var textposition = coerce('textposition');
27
+ handleText(traceIn, traceOut, layout, coerce, textposition, {
28
+ moduleHasSelected: true,
29
+ moduleHasUnselected: true,
30
+ moduleHasConstrain: true,
31
+ moduleHasCliponaxis: true,
32
+ moduleHasTextangle: true,
33
+ moduleHasInsideanchor: true
34
+ });
35
+
25
36
  coerce('hovertext');
26
37
  coerce('hovertemplate');
27
38
  coerce('xhoverformat');
@@ -6,6 +6,7 @@ var heatmapAttrs = require('../heatmap/attributes');
6
6
  var baseAttrs = require('../../plots/attributes');
7
7
  var axisHoverFormat = require('../../plots/cartesian/axis_format_attributes').axisHoverFormat;
8
8
  var hovertemplateAttrs = require('../../plots/template_attributes').hovertemplateAttrs;
9
+ var texttemplateAttrs = require('../../plots/template_attributes').texttemplateAttrs;
9
10
  var colorScaleAttrs = require('../../components/colorscale/attributes');
10
11
 
11
12
  var extendFlat = require('../../lib/extend').extendFlat;
@@ -69,6 +70,13 @@ module.exports = extendFlat(
69
70
  yhoverformat: axisHoverFormat('y'),
70
71
  zhoverformat: axisHoverFormat('z', 1),
71
72
  hovertemplate: hovertemplateAttrs({}, {keys: 'z'}),
73
+ texttemplate: texttemplateAttrs({
74
+ arrayOk: false,
75
+ editType: 'plot'
76
+ }, {
77
+ keys: 'z'
78
+ }),
79
+ textfont: heatmapAttrs.textfont,
72
80
  showlegend: extendFlat({}, baseAttrs.showlegend, {dflt: false})
73
81
  },
74
82
  colorScaleAttrs('', {cLetter: 'z', autoColorDflt: false})
@@ -5,6 +5,7 @@ var Lib = require('../../lib');
5
5
  var handleSampleDefaults = require('./sample_defaults');
6
6
  var handleStyleDefaults = require('../heatmap/style_defaults');
7
7
  var colorscaleDefaults = require('../../components/colorscale/defaults');
8
+ var handleHeatmapLabelDefaults = require('../heatmap/label_defaults');
8
9
  var attributes = require('./attributes');
9
10
 
10
11
 
@@ -19,6 +20,9 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
19
20
  handleStyleDefaults(traceIn, traceOut, coerce, layout);
20
21
  colorscaleDefaults(traceIn, traceOut, layout, coerce, {prefix: '', cLetter: 'z'});
21
22
  coerce('hovertemplate');
23
+
24
+ handleHeatmapLabelDefaults(coerce, layout);
25
+
22
26
  coerce('xhoverformat');
23
27
  coerce('yhoverformat');
24
28
  };
@@ -42,7 +42,9 @@ module.exports = extendFlat({
42
42
  xhoverformat: axisHoverFormat('x'),
43
43
  yhoverformat: axisHoverFormat('y'),
44
44
  zhoverformat: axisHoverFormat('z', 1),
45
- hovertemplate: histogram2dAttrs.hovertemplate
45
+ hovertemplate: histogram2dAttrs.hovertemplate,
46
+ texttemplate: contourAttrs.texttemplate,
47
+ textfont: contourAttrs.textfont
46
48
  },
47
49
  colorScaleAttrs('', {
48
50
  cLetter: 'z',
@@ -5,6 +5,7 @@ var Lib = require('../../lib');
5
5
  var handleSampleDefaults = require('../histogram2d/sample_defaults');
6
6
  var handleContoursDefaults = require('../contour/contours_defaults');
7
7
  var handleStyleDefaults = require('../contour/style_defaults');
8
+ var handleHeatmapLabelDefaults = require('../heatmap/label_defaults');
8
9
  var attributes = require('./attributes');
9
10
 
10
11
 
@@ -22,7 +23,13 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
22
23
 
23
24
  handleContoursDefaults(traceIn, traceOut, coerce, coerce2);
24
25
  handleStyleDefaults(traceIn, traceOut, coerce, layout);
25
- coerce('hovertemplate');
26
26
  coerce('xhoverformat');
27
27
  coerce('yhoverformat');
28
+ coerce('hovertemplate');
29
+ if(
30
+ traceOut.contours &&
31
+ traceOut.contours.coloring === 'heatmap'
32
+ ) {
33
+ handleHeatmapLabelDefaults(coerce, layout);
34
+ }
28
35
  };
@@ -39,7 +39,6 @@ function calc(gd, trace) {
39
39
  v = vals[i];
40
40
  if(!isNumeric(v)) continue;
41
41
  v = +v;
42
- if(v < 0) continue;
43
42
  } else v = 1;
44
43
 
45
44
  label = labels[i];
@@ -76,6 +75,9 @@ function calc(gd, trace) {
76
75
  }
77
76
  }
78
77
 
78
+ // Drop aggregate sums of value 0 or less
79
+ cd = cd.filter(function(elem) { return elem.v >= 0; });
80
+
79
81
  var shouldSort = (trace.type === 'funnelarea') ? isAggregated : trace.sort;
80
82
  if(shouldSort) cd.sort(function(a, b) { return b.v - a.v; });
81
83
 
package/src/version.js CHANGED
@@ -1,4 +1,4 @@
1
1
  'use strict';
2
2
 
3
3
  // package version injected by `npm run preprocess`
4
- exports.version = '2.6.2';
4
+ exports.version = '2.8.0';
@@ -85,6 +85,7 @@ function notBlackListed(name) {
85
85
 
86
86
  // has contourcarpet See https://github.com/plotly/plotly.js/issues/5669
87
87
  'airfoil',
88
+ 'h-colorbar_airfoil',
88
89
  'cheater',
89
90
  'cheater_constraint_greater_than',
90
91
  'cheater_constraint_greater_than_with_hill',