diff --git a/package-lock.json b/package-lock.json index e8576ea1ccf..7299454d205 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4594,16 +4594,16 @@ } }, "gl-heatmap2d": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/gl-heatmap2d/-/gl-heatmap2d-1.0.6.tgz", - "integrity": "sha512-+agzSv4R5vsaH+AGYVz5RVzBK10amqAa+Bwj205F13JjNSGS91M1L9Yb8zssCv2FIjpP+1Mp73cFBYrQFfS1Jg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/gl-heatmap2d/-/gl-heatmap2d-1.1.0.tgz", + "integrity": "sha512-0FLXyxv6UBCzzhi4Q2u+9fUs6BX1+r5ZztFe27VikE9FUVw7hZiuSHmgDng92EpydogcSYHXCIK8+58RagODug==", "requires": { "binary-search-bounds": "^2.0.4", "gl-buffer": "^2.1.2", "gl-shader": "^4.2.1", "glslify": "^7.0.0", "iota-array": "^1.0.0", - "typedarray-pool": "^1.1.0" + "typedarray-pool": "^1.2.0" } }, "gl-line3d": { diff --git a/package.json b/package.json index 1cd36c8ead8..eb4684ab15d 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "gl-cone3d": "^1.5.2", "gl-contour2d": "^1.1.7", "gl-error3d": "^1.0.16", - "gl-heatmap2d": "^1.0.6", + "gl-heatmap2d": "^1.1.0", "gl-line3d": "1.2.1", "gl-mat4": "^1.2.0", "gl-mesh3d": "^2.3.1", diff --git a/src/traces/heatmapgl/attributes.js b/src/traces/heatmapgl/attributes.js index f0ef216766d..a47ce9c8ac3 100644 --- a/src/traces/heatmapgl/attributes.js +++ b/src/traces/heatmapgl/attributes.js @@ -29,6 +29,15 @@ for(var i = 0; i < commonList.length; i++) { attrs[k] = heatmapAttrs[k]; } +attrs.zsmooth = { + valType: 'enumerated', + values: ['fast', false], + dflt: 'fast', + role: 'style', + editType: 'calc', + description: 'Picks a smoothing algorithm use to smooth `z` data.' +}; + extendFlat( attrs, colorScaleAttrs('', {cLetter: 'z', autoColorDflt: false}) diff --git a/src/traces/heatmapgl/convert.js b/src/traces/heatmapgl/convert.js index ae8727125b9..d78723dc05d 100644 --- a/src/traces/heatmapgl/convert.js +++ b/src/traces/heatmapgl/convert.js @@ -31,6 +31,7 @@ function Heatmap(scene, uid) { this.bounds = [0, 0, 0, 0]; this.options = { + zsmooth: 'fast', z: [], x: [], y: [], @@ -85,6 +86,7 @@ proto.update = function(fullTrace, calcTrace) { this.options.x = calcPt.x; this.options.y = calcPt.y; + this.options.zsmooth = fullTrace.zsmooth; var colorOptions = convertColorscale(fullTrace); this.options.colorLevels = colorOptions.colorLevels; @@ -97,8 +99,16 @@ proto.update = function(fullTrace, calcTrace) { var xa = this.scene.xaxis; var ya = this.scene.yaxis; - fullTrace._extremes[xa._id] = Axes.findExtremes(xa, calcPt.x); - fullTrace._extremes[ya._id] = Axes.findExtremes(ya, calcPt.y); + + var xOpts, yOpts; + if(fullTrace.zsmooth === false) { + // increase padding for discretised heatmap as suggested by Louise Ord + xOpts = { ppad: calcPt.x[1] - calcPt.x[0] }; + yOpts = { ppad: calcPt.y[1] - calcPt.y[0] }; + } + + fullTrace._extremes[xa._id] = Axes.findExtremes(xa, calcPt.x, xOpts); + fullTrace._extremes[ya._id] = Axes.findExtremes(ya, calcPt.y, yOpts); }; proto.dispose = function() { diff --git a/src/traces/heatmapgl/defaults.js b/src/traces/heatmapgl/defaults.js index b9ead7b8107..1f164bc33c5 100644 --- a/src/traces/heatmapgl/defaults.js +++ b/src/traces/heatmapgl/defaults.js @@ -28,6 +28,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout } coerce('text'); + coerce('zsmooth'); colorscaleDefaults(traceIn, traceOut, layout, coerce, {prefix: '', cLetter: 'z'}); }; diff --git a/test/image/baselines/gl2d_heatmapgl_discrete.png b/test/image/baselines/gl2d_heatmapgl_discrete.png new file mode 100644 index 00000000000..4885dd3861d Binary files /dev/null and b/test/image/baselines/gl2d_heatmapgl_discrete.png differ diff --git a/test/image/mocks/gl2d_heatmapgl_discrete.json b/test/image/mocks/gl2d_heatmapgl_discrete.json new file mode 100644 index 00000000000..cdd21d6e92c --- /dev/null +++ b/test/image/mocks/gl2d_heatmapgl_discrete.json @@ -0,0 +1,135 @@ +{ + "data": [ + { + "type": "heatmapgl", + "zsmooth": false, + "z": [ + [ + 125, + 106, + 89, + 74, + 61, + 50, + 41, + 34, + 29, + 26 + ], + [ + 116, + 97, + 80, + 65, + 52, + 41, + 32, + 25, + 20, + 17 + ], + [ + 109, + 90, + 73, + 58, + 45, + 34, + 25, + 18, + 13, + 10 + ], + [ + 104, + 85, + 68, + 53, + 40, + 29, + 20, + 13, + 8, + 5 + ], + [ + 101, + 82, + 65, + 50, + 37, + 26, + 17, + 10, + 5, + 2 + ], + [ + 100, + 81, + 64, + 49, + 36, + 25, + 16, + 9, + 4, + 1 + ], + [ + 101, + 82, + 65, + 50, + 37, + 26, + 17, + 10, + 5, + 2 + ], + [ + 104, + 85, + 68, + 53, + 40, + 29, + 20, + 13, + 8, + 5 + ], + [ + 109, + 90, + 73, + 58, + 45, + 34, + 25, + 18, + 13, + 10 + ], + [ + 116, + 97, + 80, + 65, + 52, + 41, + 32, + 25, + 20, + 17 + ] + ], + "colorscale": "Viridis" + } + ], + "layout": { + "height": 450, + "width": 550 + } +} diff --git a/test/jasmine/tests/mock_test.js b/test/jasmine/tests/mock_test.js index 22e54a4a04c..615eb5b6c90 100644 --- a/test/jasmine/tests/mock_test.js +++ b/test/jasmine/tests/mock_test.js @@ -375,6 +375,7 @@ var list = [ 'gl2d_fill-ordering', 'gl2d_fonts', 'gl2d_heatmapgl', + 'gl2d_heatmapgl_discrete', 'gl2d_horiz-lines', 'gl2d_layout_image', 'gl2d_line_aligned', @@ -1417,6 +1418,7 @@ figs['gl2d_error_bars_log'] = require('@mocks/gl2d_error_bars_log'); figs['gl2d_fill-ordering'] = require('@mocks/gl2d_fill-ordering'); // figs['gl2d_fonts'] = require('@mocks/gl2d_fonts'); figs['gl2d_heatmapgl'] = require('@mocks/gl2d_heatmapgl'); +figs['gl2d_heatmapgl_discrete'] = require('@mocks/gl2d_heatmapgl_discrete'); figs['gl2d_horiz-lines'] = require('@mocks/gl2d_horiz-lines'); // figs['gl2d_layout_image'] = require('@mocks/gl2d_layout_image'); figs['gl2d_line_aligned'] = require('@mocks/gl2d_line_aligned');