diff --git a/src/plot_api/plot_api.js b/src/plot_api/plot_api.js index bd9f22f8fe8..c7753f8954b 100644 --- a/src/plot_api/plot_api.js +++ b/src/plot_api/plot_api.js @@ -1314,7 +1314,7 @@ function _restyle(gd, aobj, _traces) { // objects need to be made) but not a recalc var replotAttrs = [ 'zmin', 'zmax', 'zauto', - 'xgap', 'ygap', + 'xgap', 'ygap', 'nancolor', 'marker.cmin', 'marker.cmax', 'marker.cauto', 'line.cmin', 'line.cmax', 'marker.line.cmin', 'marker.line.cmax', diff --git a/src/traces/heatmap/attributes.js b/src/traces/heatmap/attributes.js index da86b34d004..8b69f046b1a 100644 --- a/src/traces/heatmap/attributes.js +++ b/src/traces/heatmap/attributes.js @@ -90,6 +90,13 @@ module.exports = extendFlat({}, { role: 'style', description: 'Sets the vertical gap (in pixels) between bricks.' }, + nancolor: { + valType: 'color', + dflt: 'rgba(0,0,0,0)', + role: 'style', + description: 'Sets the color associated with NaN values in `z`.' + + } }, colorscaleAttrs, { autocolorscale: extendFlat({}, colorscaleAttrs.autocolorscale, {dflt: false}) }, diff --git a/src/traces/heatmap/defaults.js b/src/traces/heatmap/defaults.js index f41624cf57e..3dff11dba03 100644 --- a/src/traces/heatmap/defaults.js +++ b/src/traces/heatmap/defaults.js @@ -29,6 +29,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout } coerce('text'); + coerce('nancolor'); var zsmooth = coerce('zsmooth'); if(zsmooth === false) { diff --git a/src/traces/heatmap/plot.js b/src/traces/heatmap/plot.js index 21d530f8c80..9f5e27f6df3 100644 --- a/src/traces/heatmap/plot.js +++ b/src/traces/heatmap/plot.js @@ -282,20 +282,23 @@ function plotOne(gd, plotinfo, cd) { return padding; } + var nanTc = tinycolor(trace.nancolor).toRgb(), + nanColor = [nanTc.r, nanTc.g, nanTc.b, nanTc.a]; + function setColor(v, pixsize) { - if(v !== undefined) { - var c = sclFunc(v); - c[0] = Math.round(c[0]); - c[1] = Math.round(c[1]); - c[2] = Math.round(c[2]); - - pixcount += pixsize; - rcount += c[0] * pixsize; - gcount += c[1] * pixsize; - bcount += c[2] * pixsize; - return c; - } - return [0, 0, 0, 0]; + pixcount += pixsize; + + var c = v !== undefined ? sclFunc(v) : nanColor; + + c[0] = Math.round(c[0]); + c[1] = Math.round(c[1]); + c[2] = Math.round(c[2]); + + rcount += c[0] * pixsize; + gcount += c[1] * pixsize; + bcount += c[2] * pixsize; + + return c; } function putColor(pixels, pxIndex, c) {