From 868ca71b0947aaf5dc7f7d1f0fa1854366299b34 Mon Sep 17 00:00:00 2001 From: etienne Date: Thu, 1 Feb 2018 12:15:10 -0500 Subject: [PATCH 1/2] :recycle: makeBubbleSizeFunc in calcMarkerSize --- src/traces/scatter/calc.js | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/src/traces/scatter/calc.js b/src/traces/scatter/calc.js index 49f3105f9e9..dac1a8cfc3c 100644 --- a/src/traces/scatter/calc.js +++ b/src/traces/scatter/calc.js @@ -11,6 +11,7 @@ var isNumeric = require('fast-isnumeric'); +var Lib = require('../../lib'); var Axes = require('../../plots/cartesian/axes'); var BADNUM = require('../../constants/numerical').BADNUM; @@ -18,6 +19,7 @@ var subTypes = require('./subtypes'); var calcColorscale = require('./colorscale_calc'); var arraysToCalcdata = require('./arrays_to_calcdata'); var calcSelection = require('./calc_selection'); +var makeBubbleSizeFn = require('./make_bubble_size_func'); function calc(gd, trace) { var xa = Axes.getFromId(gd, trace.xaxis || 'x'); @@ -101,21 +103,22 @@ function calcMarkerSize(trace, serieslen) { // Treat size like x or y arrays --- Run d2c // this needs to go before ppad computation var marker = trace.marker; - var sizeref = 1.6 * (trace.marker.sizeref || 1); - var markerTrans; - - if(trace.marker.sizemode === 'area') { - markerTrans = function(v) { - return Math.max(Math.sqrt((v || 0) / sizeref), 3); - }; - } else { - markerTrans = function(v) { - return Math.max((v || 0) / sizeref, 3); - }; - } + + // use a modified version of the bubble size function + // with smaller sizeref (resulting in a pad factor) + // and making non-numeric and size-0 points count as pad=3. + var sizeFn = makeBubbleSizeFn({ + marker: Lib.extendFlat({}, marker, { + sizemode: marker.sizemode || 'diameter', + sizeref: 0.8 * (marker.sizeref || 1), + }) + }); + var markerTrans = function(v) { + return Math.max(sizeFn(v), 3); + }; if(Array.isArray(marker.size)) { - // I tried auto-type but category and dates dont make much sense. + // no need to auto-type as category and dates do not make much sense. var ax = {type: 'linear'}; Axes.setConvert(ax); @@ -123,9 +126,9 @@ function calcMarkerSize(trace, serieslen) { if(s.length > serieslen) s.splice(serieslen, s.length - serieslen); return s.map(markerTrans); - } else { - return markerTrans(marker.size); } + + return markerTrans(marker.size); } module.exports = { From a5eb3c0b879b15ed05deaca7ef81a1b2a1d9ec47 Mon Sep 17 00:00:00 2001 From: etienne Date: Thu, 1 Feb 2018 12:16:22 -0500 Subject: [PATCH 2/2] add 'sizemax', 'sizedata(min|max') & sizemode 'log-(diamter|area)' .. to all scatter-like traces. --- src/components/legend/style.js | 5 +- src/traces/scatter/attributes.js | 61 +++++++++++++++++--- src/traces/scatter/make_bubble_size_func.js | 58 ++++++++++++------- src/traces/scatter/marker_defaults.js | 5 +- src/traces/scatter3d/attributes.js | 5 +- src/traces/scattercarpet/attributes.js | 5 +- src/traces/scattergeo/attributes.js | 5 +- src/traces/scattergl/attributes.js | 5 +- src/traces/scattermapbox/attributes.js | 5 +- src/traces/scatterternary/attributes.js | 5 +- test/image/baselines/bubble_scale.png | Bin 0 -> 50080 bytes test/image/mocks/bubble_scale.json | 48 +++++++++++++++ 12 files changed, 168 insertions(+), 39 deletions(-) create mode 100644 test/image/baselines/bubble_scale.png create mode 100644 test/image/mocks/bubble_scale.json diff --git a/src/components/legend/style.js b/src/components/legend/style.js index 31f8661a882..d9b30a2ea97 100644 --- a/src/components/legend/style.js +++ b/src/components/legend/style.js @@ -123,9 +123,12 @@ module.exports = function style(s, gd) { dEdit.mlc = boundVal('marker.line.color', pickFirst); dEdit.mlw = boundVal('marker.line.width', Lib.mean, [0, 5]); tEdit.marker = { + sizemode: 'diameter', sizeref: 1, sizemin: 1, - sizemode: 'diameter' + sizemax: null, + sizedatamin: null, + sizedatamax: null }; } diff --git a/src/traces/scatter/attributes.js b/src/traces/scatter/attributes.js index e132100b5af..cab9ba70820 100644 --- a/src/traces/scatter/attributes.js +++ b/src/traces/scatter/attributes.js @@ -288,6 +288,28 @@ module.exports = { '*0* corresponds to no limit.' ].join(' ') }, + + sizemode: { + valType: 'enumerated', + values: ['diameter', 'area', 'log-diameter', 'log-area'], + dflt: 'diameter', + role: 'info', + editType: 'calc', + description: [ + 'Has an effect only if `marker.size` is set to a numerical array.', + 'Sets the rule for which the data in `size` is converted', + 'to pixels.', + 'When set to *diameter*, `marker.size` data is proportional to', + 'marker points\' diameter.', + 'When set to *area*, `marker.size` data is proportional to', + 'marker points\' area.', + 'When set to *log-diameter*, the base10 log of the `marker.size` data', + 'is proportional to marker points\' diameter .', + 'When set to *log-area*, the base10 log of the `marker.size` data', + 'is proportional to marker points\' area.', + 'In each case the proportionality constant is set using `sizeref`.' + ].join(' ') + }, sizeref: { valType: 'number', dflt: 1, @@ -295,8 +317,8 @@ module.exports = { editType: 'calc', description: [ 'Has an effect only if `marker.size` is set to a numerical array.', - 'Sets the scale factor used to determine the rendered size of', - 'marker points. Use with `sizemin` and `sizemode`.' + 'Sets the proportionality constant in the `marker.size` data', + 'to marker point size conversion (More info under `sizemode`).' ].join(' ') }, sizemin: { @@ -310,16 +332,37 @@ module.exports = { 'Sets the minimum size (in px) of the rendered marker points.' ].join(' ') }, - sizemode: { - valType: 'enumerated', - values: ['diameter', 'area'], - dflt: 'diameter', - role: 'info', + sizemax: { + valType: 'number', + min: 0, + role: 'style', editType: 'calc', description: [ 'Has an effect only if `marker.size` is set to a numerical array.', - 'Sets the rule for which the data in `size` is converted', - 'to pixels.' + 'Sets the maximum size (in px) of the rendered marker points.' + ].join(' ') + }, + sizedatamin: { + valType: 'number', + min: 0, + dflt: 0, + role: 'style', + editType: 'calc', + description: [ + 'Has an effect only if `marker.size` is set to a numerical array.', + 'Sets the minimum `marker.size` value to be scaled.', + 'Values smaller than `sizedatamin` are displayed with `sizemin`.' + ].join(' ') + }, + sizedatamax: { + valType: 'number', + min: 0, + role: 'style', + editType: 'calc', + description: [ + 'Has an effect only if `marker.size` is set to a numerical array.', + 'Sets the maximum `marker.size` value to be scaled.', + 'Values greater than `sizedatamin` are displayed with `sizemax`.' ].join(' ') }, diff --git a/src/traces/scatter/make_bubble_size_func.js b/src/traces/scatter/make_bubble_size_func.js index 4426dc92c7d..4c98b248dd8 100644 --- a/src/traces/scatter/make_bubble_size_func.js +++ b/src/traces/scatter/make_bubble_size_func.js @@ -6,35 +6,49 @@ * LICENSE file in the root directory of this source tree. */ - 'use strict'; var isNumeric = require('fast-isnumeric'); +function toLog(v) { + return Math.log(v) / Math.LN10; +} -// used in the drawing step for 'scatter' and 'scattegeo' and -// in the convert step for 'scatter3d' module.exports = function makeBubbleSizeFn(trace) { - var marker = trace.marker, - sizeRef = marker.sizeref || 1, - sizeMin = marker.sizemin || 0; - - // for bubble charts, allow scaling the provided value linearly - // and by area or diameter. - // Note this only applies to the array-value sizes - - var baseFn = (marker.sizemode === 'area') ? - function(v) { return Math.sqrt(v / sizeRef); } : - function(v) { return v / sizeRef; }; - - // TODO add support for position/negative bubbles? - // TODO add 'sizeoffset' attribute? + var marker = trace.marker; + var sizeRef = marker.sizeref || 1; + var sizeMin = marker.sizemin || 0; + var sizeMax = marker.sizemax || Infinity; + var sizeDataMin = marker.sizedatamin || 0; + var sizeDataMax = marker.sizedatamax || Infinity; + var baseFn; + + switch(marker.sizemode) { + case 'area': + baseFn = function(v) { return Math.sqrt(v / sizeRef); }; + break; + case 'log-diameter': + baseFn = function(v) { return toLog(v) / sizeRef; }; + break; + case 'log-area': + baseFn = function(v) { return Math.sqrt(toLog(v) / sizeRef); }; + break; + default: + baseFn = function(v) { return v / sizeRef; }; + break; + } + + // non-numeric and negative data values AND sizes correspond to size=0 points, + // clamp positive data values outside data range to px extrema return function(v) { - var baseSize = baseFn(v / 2); - - // don't show non-numeric and negative sizes - return (isNumeric(baseSize) && (baseSize > 0)) ? - Math.max(baseSize, sizeMin) : + if(isNumeric(v) && v > 0) { + if(v <= sizeDataMin) return sizeMin; + if(v >= sizeDataMax) return sizeMax; + } + + var s = baseFn(v / 2); + return isNumeric(s) && s > 0 ? + Math.min(Math.max(s, sizeMin), sizeMax) : 0; }; }; diff --git a/src/traces/scatter/marker_defaults.js b/src/traces/scatter/marker_defaults.js index e0b9cf4fd68..66dd6dd5c84 100644 --- a/src/traces/scatter/marker_defaults.js +++ b/src/traces/scatter/marker_defaults.js @@ -67,9 +67,12 @@ module.exports = function markerDefaults(traceIn, traceOut, defaultColor, layout } if(isBubble) { + coerce('marker.sizemode'); coerce('marker.sizeref'); coerce('marker.sizemin'); - coerce('marker.sizemode'); + coerce('marker.sizemax'); + coerce('marker.sizedatamin'); + coerce('marker.sizedatamax'); } if(opts.gradient) { diff --git a/src/traces/scatter3d/attributes.js b/src/traces/scatter3d/attributes.js index 229f51e1c5f..468674a98bd 100644 --- a/src/traces/scatter3d/attributes.js +++ b/src/traces/scatter3d/attributes.js @@ -139,9 +139,12 @@ var attrs = module.exports = overrideAll({ description: 'Sets the marker symbol type.' }, size: extendFlat({}, scatterMarkerAttrs.size, {dflt: 8}), + sizemode: scatterMarkerAttrs.sizemode, sizeref: scatterMarkerAttrs.sizeref, sizemin: scatterMarkerAttrs.sizemin, - sizemode: scatterMarkerAttrs.sizemode, + sizemax: scatterMarkerAttrs.sizemax, + sizedatamin: scatterMarkerAttrs.sizedatamin, + sizedatamax: scatterMarkerAttrs.sizedatamax, opacity: extendFlat({}, scatterMarkerAttrs.opacity, { arrayOk: false, description: [ diff --git a/src/traces/scattercarpet/attributes.js b/src/traces/scattercarpet/attributes.js index 19ee866b509..4ff5ca2a588 100644 --- a/src/traces/scattercarpet/attributes.js +++ b/src/traces/scattercarpet/attributes.js @@ -92,9 +92,12 @@ module.exports = { opacity: scatterMarkerAttrs.opacity, maxdisplayed: scatterMarkerAttrs.maxdisplayed, size: scatterMarkerAttrs.size, + sizemode: scatterMarkerAttrs.sizemode, sizeref: scatterMarkerAttrs.sizeref, sizemin: scatterMarkerAttrs.sizemin, - sizemode: scatterMarkerAttrs.sizemode, + sizemax: scatterMarkerAttrs.sizemax, + sizedatamin: scatterMarkerAttrs.sizedatamin, + sizedatamax: scatterMarkerAttrs.sizedatamax, line: extendFlat({ width: scatterMarkerLineAttrs.width, editType: 'calc' diff --git a/src/traces/scattergeo/attributes.js b/src/traces/scattergeo/attributes.js index 0cedfe2aed9..0192cd78d4b 100644 --- a/src/traces/scattergeo/attributes.js +++ b/src/traces/scattergeo/attributes.js @@ -89,9 +89,12 @@ module.exports = overrideAll({ symbol: scatterMarkerAttrs.symbol, opacity: scatterMarkerAttrs.opacity, size: scatterMarkerAttrs.size, + sizemode: scatterMarkerAttrs.sizemode, sizeref: scatterMarkerAttrs.sizeref, sizemin: scatterMarkerAttrs.sizemin, - sizemode: scatterMarkerAttrs.sizemode, + sizemax: scatterMarkerAttrs.sizemax, + sizedatamin: scatterMarkerAttrs.sizedatamin, + sizedatamax: scatterMarkerAttrs.sizedatamax, showscale: scatterMarkerAttrs.showscale, colorbar: scatterMarkerAttrs.colorbar, line: extendFlat({ diff --git a/src/traces/scattergl/attributes.js b/src/traces/scattergl/attributes.js index 0c69b843c0a..faa73fcf640 100644 --- a/src/traces/scattergl/attributes.js +++ b/src/traces/scattergl/attributes.js @@ -59,9 +59,12 @@ var attrs = module.exports = overrideAll({ marker: extendFlat({}, colorAttributes('marker'), { symbol: scatterMarkerAttrs.symbol, size: scatterMarkerAttrs.size, + sizemode: scatterMarkerAttrs.sizemode, sizeref: scatterMarkerAttrs.sizeref, sizemin: scatterMarkerAttrs.sizemin, - sizemode: scatterMarkerAttrs.sizemode, + sizemax: scatterMarkerAttrs.sizemax, + sizedatamin: scatterMarkerAttrs.sizedatamin, + sizedatamax: scatterMarkerAttrs.sizedatamax, opacity: scatterMarkerAttrs.opacity, showscale: scatterMarkerAttrs.showscale, colorbar: scatterMarkerAttrs.colorbar, diff --git a/src/traces/scattermapbox/attributes.js b/src/traces/scattermapbox/attributes.js index 1c9005ec2ac..915b2e1acd3 100644 --- a/src/traces/scattermapbox/attributes.js +++ b/src/traces/scattermapbox/attributes.js @@ -85,9 +85,12 @@ module.exports = overrideAll({ }, opacity: markerAttrs.opacity, size: markerAttrs.size, + sizemode: markerAttrs.sizemode, sizeref: markerAttrs.sizeref, sizemin: markerAttrs.sizemin, - sizemode: markerAttrs.sizemode, + sizemax: markerAttrs.sizemax, + sizedatamin: markerAttrs.sizedatamin, + sizedatamax: markerAttrs.sizedatamax, color: markerAttrs.color, colorscale: markerAttrs.colorscale, cauto: markerAttrs.cauto, diff --git a/src/traces/scatterternary/attributes.js b/src/traces/scatterternary/attributes.js index d4b6ed4107c..ac98686c34b 100644 --- a/src/traces/scatterternary/attributes.js +++ b/src/traces/scatterternary/attributes.js @@ -121,9 +121,12 @@ module.exports = { opacity: scatterMarkerAttrs.opacity, maxdisplayed: scatterMarkerAttrs.maxdisplayed, size: scatterMarkerAttrs.size, + sizemode: scatterMarkerAttrs.sizemode, sizeref: scatterMarkerAttrs.sizeref, sizemin: scatterMarkerAttrs.sizemin, - sizemode: scatterMarkerAttrs.sizemode, + sizemax: scatterMarkerAttrs.sizemax, + sizedatamin: scatterMarkerAttrs.sizedatamin, + sizedatamax: scatterMarkerAttrs.sizedatamax, line: extendFlat({ width: scatterMarkerLineAttrs.width, editType: 'calc' diff --git a/test/image/baselines/bubble_scale.png b/test/image/baselines/bubble_scale.png new file mode 100644 index 0000000000000000000000000000000000000000..ef557ed183f72d364ffdd321a10d5c7dee3eafdb GIT binary patch literal 50080 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

_at@z+atz?2DOy
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

literal 0
HcmV?d00001

diff --git a/test/image/mocks/bubble_scale.json b/test/image/mocks/bubble_scale.json
new file mode 100644
index 00000000000..af4d9a3784d
--- /dev/null
+++ b/test/image/mocks/bubble_scale.json
@@ -0,0 +1,48 @@
+{
+    "data": [
+        {
+            "type": "scatter",
+            "mode": "markers",
+            "name": "log-diameter",
+            "x": [0, 9, 18, 27, 36, 45, 54, 63, 72, 81],
+            "y": [5, 5, 5, 5, 5, 5, 5, 5, 5, 5],
+            "marker": {
+                "size": [10, 100, 1000, 20, 400, 5000, 50, 300, 7000],
+                "sizemode": "log-diameter",
+                "sizeref": 0.1
+            }
+        },
+        {
+            "type": "scatter",
+            "mode": "markers",
+            "name": "log-area",
+            "x": [0, 9, 18, 27, 36, 45, 54, 63, 72, 81],
+            "y": [4, 4, 4, 4, 4, 4, 4, 4, 4, 4],
+            "marker": {
+                "size": [10, 100, 1000, 20, 400, 5000, 50, 300, 7000],
+                "sizemode": "log-area",
+                "sizeref": 0.01
+            }
+        },
+        {
+            "type": "scatter",
+            "mode": "markers",
+            "name": "data min-max",
+            "x": [0, 9, 18, 27, 36, 45, 54, 63, 72, 81],
+            "y": [3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
+            "marker": {
+                "size": [10, 100, 1000, 20, 400, 5000, 50, 300, 7000],
+                "sizedatamin": 20,
+                "sizedatamax": 100,
+                "sizemin": 50,
+                "sizemax": 60
+            }
+        }
+    ],
+    "layout": {
+        "hovermode": "closest",
+        "showlegend": true,
+        "width": 800,
+        "height": 500
+    }
+}