From 2802c7989f0b50fa9b847040e55eedade1f3f3c1 Mon Sep 17 00:00:00 2001 From: alexcjohnson Date: Mon, 18 Dec 2017 10:45:30 -0500 Subject: [PATCH 1/3] update heatmap brick padding mock to show the problem --- .../image/baselines/heatmap_brick_padding.png | Bin 24355 -> 13870 bytes test/image/mocks/heatmap_brick_padding.json | 34 +++++++++--------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/test/image/baselines/heatmap_brick_padding.png b/test/image/baselines/heatmap_brick_padding.png index 150525879a077d9b14e3dba2fdc7130bf8af4547..c574d556c5beb9b99854cf0ecf29f043665cfd33 100644 GIT binary patch literal 13870 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 literal 24355 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 diff --git a/test/image/mocks/heatmap_brick_padding.json b/test/image/mocks/heatmap_brick_padding.json index 10cd480c5d6..bfad761d6f1 100644 --- a/test/image/mocks/heatmap_brick_padding.json +++ b/test/image/mocks/heatmap_brick_padding.json @@ -2,25 +2,23 @@ "data": [ { "z": [ - [ - 1, - 20, - 30 - ], - [ - 20, - 1, - 60 - ], - [ - 30, - 60, - 1 - ] + [1, 2, 3, 4, 5], + [3, 4, 5, 6, 7], + [5, 6, 7, 8, 9], + [7, 8, 9, 8, 7], + [9, 8, 7, 6, 5] ], - "xgap": 9, - "ygap": 6, + "xgap": 20, + "ygap": 12, + "x0": 0.5, + "y0": 0.5, "type": "heatmap" } - ] + ], + "layout": { + "width": 400, + "height": 400, + "xaxis": {"zeroline": false, "showline": true, "mirror": true, "dtick": 1}, + "yaxis": {"zeroline": false, "showline": true, "mirror": true, "dtick": 1} + } } From 0d1709b2e85856912964bbb730a054d87805e41c Mon Sep 17 00:00:00 2001 From: alexcjohnson Date: Mon, 18 Dec 2017 11:20:59 -0500 Subject: [PATCH 2/3] fix heatmap gap algo: uniform gaps, all bricks centered on their data --- src/traces/heatmap/plot.js | 92 ++++-------------- .../image/baselines/heatmap_brick_padding.png | Bin 13870 -> 13376 bytes test/jasmine/tests/heatmap_test.js | 66 ++++--------- 3 files changed, 41 insertions(+), 117 deletions(-) diff --git a/src/traces/heatmap/plot.js b/src/traces/heatmap/plot.js index 48bc073f14d..beb37e90637 100644 --- a/src/traces/heatmap/plot.js +++ b/src/traces/heatmap/plot.js @@ -226,63 +226,17 @@ function plotOne(gd, plotinfo, cd) { // build the pixel map brick-by-brick // cruise through z-matrix row-by-row // build a brick at each z-matrix value - var yi = ypx(0), - yb = [yi, yi], - xbi = xrev ? 0 : 1, - ybi = yrev ? 0 : 1, - // for collecting an average luminosity of the heatmap - pixcount = 0, - rcount = 0, - gcount = 0, - bcount = 0, - brickWithPadding, - xb, - j, - xi, - v, - row, - c; - - function applyBrickPadding(trace, x0, x1, y0, y1, xIndex, xLength, yIndex, yLength) { - var padding = { - x0: x0, - x1: x1, - y0: y0, - y1: y1 - }, - xEdgeGap = trace.xgap * 2 / 3, - yEdgeGap = trace.ygap * 2 / 3, - xCenterGap = trace.xgap / 3, - yCenterGap = trace.ygap / 3; - - if(yIndex === yLength - 1) { // top edge brick - padding.y1 = y1 - yEdgeGap; - } - - if(xIndex === xLength - 1) { // right edge brick - padding.x0 = x0 + xEdgeGap; - } - - if(yIndex === 0) { // bottom edge brick - padding.y0 = y0 + yEdgeGap; - } - - if(xIndex === 0) { // left edge brick - padding.x1 = x1 - xEdgeGap; - } - - if(xIndex > 0 && xIndex < xLength - 1) { // brick in the center along x - padding.x0 = x0 + xCenterGap; - padding.x1 = x1 - xCenterGap; - } - - if(yIndex > 0 && yIndex < yLength - 1) { // brick in the center along y - padding.y0 = y0 + yCenterGap; - padding.y1 = y1 - yCenterGap; - } - - return padding; - } + var yi = ypx(0); + var yb = [yi, yi]; + var xbi = xrev ? 0 : 1; + var ybi = yrev ? 0 : 1; + // for collecting an average luminosity of the heatmap + var pixcount = 0; + var rcount = 0; + var gcount = 0; + var bcount = 0; + + var xb, j, xi, v, row, c; function setColor(v, pixsize) { if(v !== undefined) { @@ -401,6 +355,14 @@ function plotOne(gd, plotinfo, cd) { context.putImageData(imageData, 0, 0); } else { // zsmooth = false -> filling potentially large bricks works fastest with fillRect + + // gaps do not need to be exact integers, but if they *are* we will get + // cleaner edges by rounding at least one edge + var xGap = trace.xgap; + var yGap = trace.ygap; + var xGapLeft = Math.floor(xGap / 2); + var yGapTop = Math.floor(yGap / 2); + for(j = 0; j < m; j++) { row = z[j]; yb.reverse(); @@ -421,20 +383,8 @@ function plotOne(gd, plotinfo, cd) { c = setColor(v, (xb[1] - xb[0]) * (yb[1] - yb[0])); context.fillStyle = 'rgba(' + c.join(',') + ')'; - brickWithPadding = applyBrickPadding(trace, - xb[0], - xb[1], - yb[0], - yb[1], - i, - n, - j, - m); - - context.fillRect(brickWithPadding.x0, - brickWithPadding.y0, - (brickWithPadding.x1 - brickWithPadding.x0), - (brickWithPadding.y1 - brickWithPadding.y0)); + context.fillRect(xb[0] + xGapLeft, yb[0] + yGapTop, + xb[1] - xb[0] - xGap, yb[1] - yb[0] - yGap); } } } diff --git a/test/image/baselines/heatmap_brick_padding.png b/test/image/baselines/heatmap_brick_padding.png index c574d556c5beb9b99854cf0ecf29f043665cfd33..d7e9f6e15498c85692ae494bb4702054ecd895d1 100644 GIT binary patch literal 13376 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 diff --git a/test/jasmine/tests/heatmap_test.js b/test/jasmine/tests/heatmap_test.js index 70c86e4e816..a102fd9b857 100644 --- a/test/jasmine/tests/heatmap_test.js +++ b/test/jasmine/tests/heatmap_test.js @@ -10,6 +10,7 @@ var d3 = require('d3'); var createGraphDiv = require('../assets/create_graph_div'); var destroyGraphDiv = require('../assets/destroy_graph_div'); var supplyAllDefaults = require('../assets/supply_defaults'); +var failTest = require('../assets/fail_test'); describe('heatmap supplyDefaults', function() { @@ -542,52 +543,25 @@ describe('heatmap plot', function() { argumentsWithoutPadding = getContextStub.fillRect.calls.allArgs().slice(0); return Plotly.plot(gd, mockWithPadding.data, mockWithPadding.layout); }).then(function() { - var centerXGap = mockWithPadding.data[0].xgap / 3; - var centerYGap = mockWithPadding.data[0].ygap / 3; - var edgeXGap = mockWithPadding.data[0].xgap * 2 / 3; - var edgeYGap = mockWithPadding.data[0].ygap * 2 / 3; - - argumentsWithPadding = getContextStub.fillRect.calls.allArgs().slice(getContextStub.fillRect.calls.allArgs().length - 9); - expect(argumentsWithPadding).toEqual([ - [argumentsWithoutPadding[0][0], - argumentsWithoutPadding[0][1] + edgeYGap, - argumentsWithoutPadding[0][2] - edgeXGap, - argumentsWithoutPadding[0][3] - edgeYGap], - [argumentsWithoutPadding[1][0] + centerXGap, - argumentsWithoutPadding[1][1] + edgeYGap, - argumentsWithoutPadding[1][2] - edgeXGap, - argumentsWithoutPadding[1][3] - edgeYGap], - [argumentsWithoutPadding[2][0] + edgeXGap, - argumentsWithoutPadding[2][1] + edgeYGap, - argumentsWithoutPadding[2][2] - edgeXGap, - argumentsWithoutPadding[2][3] - edgeYGap], - [argumentsWithoutPadding[3][0], - argumentsWithoutPadding[3][1] + centerYGap, - argumentsWithoutPadding[3][2] - edgeXGap, - argumentsWithoutPadding[3][3] - edgeYGap], - [argumentsWithoutPadding[4][0] + centerXGap, - argumentsWithoutPadding[4][1] + centerYGap, - argumentsWithoutPadding[4][2] - edgeXGap, - argumentsWithoutPadding[4][3] - edgeYGap], - [argumentsWithoutPadding[5][0] + edgeXGap, - argumentsWithoutPadding[5][1] + centerYGap, - argumentsWithoutPadding[5][2] - edgeXGap, - argumentsWithoutPadding[5][3] - edgeYGap], - [argumentsWithoutPadding[6][0], - argumentsWithoutPadding[6][1], - argumentsWithoutPadding[6][2] - edgeXGap, - argumentsWithoutPadding[6][3] - edgeYGap], - [argumentsWithoutPadding[7][0] + centerXGap, - argumentsWithoutPadding[7][1], - argumentsWithoutPadding[7][2] - edgeXGap, - argumentsWithoutPadding[7][3] - edgeYGap], - [argumentsWithoutPadding[8][0] + edgeXGap, - argumentsWithoutPadding[8][1], - argumentsWithoutPadding[8][2] - edgeXGap, - argumentsWithoutPadding[8][3] - edgeYGap - ]]); - done(); - }); + var xGap = mockWithPadding.data[0].xgap; + var yGap = mockWithPadding.data[0].ygap; + var xGapLeft = xGap / 2; + var yGapTop = yGap / 2; + + argumentsWithPadding = getContextStub.fillRect.calls.allArgs() + .slice(getContextStub.fillRect.calls.allArgs().length - 25); + + expect(argumentsWithPadding.length).toBe(25); + + argumentsWithPadding.forEach(function(args, i) { + expect(args[0]).toBe(argumentsWithoutPadding[i][0] + xGapLeft, i); + expect(args[1]).toBe(argumentsWithoutPadding[i][1] + yGapTop, i); + expect(args[2]).toBe(argumentsWithoutPadding[i][2] - xGap, i); + expect(args[3]).toBe(argumentsWithoutPadding[i][3] - yGap, i); + }); + }) + .catch(failTest) + .then(done); }); }); From 6f903351ecfc20260d56f7ce7a63fe2ff426b8ae Mon Sep 17 00:00:00 2001 From: alexcjohnson Date: Mon, 18 Dec 2017 12:06:16 -0500 Subject: [PATCH 3/3] longer timeout for choropleth bundle test hopefully avoid this particular spurious test failure... --- test/jasmine/bundle_tests/choropleth_test.js | 22 ++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/test/jasmine/bundle_tests/choropleth_test.js b/test/jasmine/bundle_tests/choropleth_test.js index f79094d6607..90e5f8880c2 100644 --- a/test/jasmine/bundle_tests/choropleth_test.js +++ b/test/jasmine/bundle_tests/choropleth_test.js @@ -5,6 +5,9 @@ var PlotlyChoropleth = require('@lib/choropleth'); var createGraphDiv = require('../assets/create_graph_div'); var destroyGraphDiv = require('../assets/destroy_graph_div'); +var failTest = require('../assets/fail_test'); + +var LONG_TIMEOUT_INTERVAL = 5 * jasmine.DEFAULT_TIMEOUT_INTERVAL; describe('Bundle with choropleth', function() { @@ -12,17 +15,24 @@ describe('Bundle with choropleth', function() { Plotly.register(PlotlyChoropleth); + var gd; + var mock = require('@mocks/geo_multiple-usa-choropleths.json'); - beforeEach(function(done) { - Plotly.plot(createGraphDiv(), mock.data, mock.layout).then(done); + beforeEach(function() { + gd = createGraphDiv(); }); afterEach(destroyGraphDiv); - it('should graph choropleth traces', function() { - var nodes = d3.selectAll('g.trace.choropleth'); + it('should graph choropleth traces', function(done) { + Plotly.plot(gd, mock.data, mock.layout) + .then(function() { + var nodes = d3.selectAll('g.trace.choropleth'); - expect(nodes.size()).toEqual(4); - }); + expect(nodes.size()).toEqual(4); + }) + .catch(failTest) + .then(done); + }, LONG_TIMEOUT_INTERVAL); });