Skip to content

Commit 9927079

Browse files
authored
Merge pull request #4056 from plotly/fix4047-bar-size-and-width-zero
Bug fix - do not display empty bars when line.width is zero
2 parents 20e033f + 579a1b5 commit 9927079

9 files changed

+724
-18
lines changed

src/lib/index.js

+14-2
Original file line numberDiff line numberDiff line change
@@ -459,13 +459,25 @@ lib.noneOrAll = function(containerIn, containerOut, attrList) {
459459
* @param {object} cd : calcdata trace
460460
* @param {string} cdAttr : calcdata key
461461
*/
462-
lib.mergeArray = function(traceAttr, cd, cdAttr) {
462+
lib.mergeArray = function(traceAttr, cd, cdAttr, fn) {
463+
var hasFn = typeof fn === 'function';
463464
if(lib.isArrayOrTypedArray(traceAttr)) {
464465
var imax = Math.min(traceAttr.length, cd.length);
465-
for(var i = 0; i < imax; i++) cd[i][cdAttr] = traceAttr[i];
466+
for(var i = 0; i < imax; i++) {
467+
var v = traceAttr[i];
468+
cd[i][cdAttr] = hasFn ? fn(v) : v;
469+
}
466470
}
467471
};
468472

473+
// cast numbers to positive numbers, returns 0 if not greater than 0
474+
lib.mergeArrayCastPositive = function(traceAttr, cd, cdAttr) {
475+
return lib.mergeArray(traceAttr, cd, cdAttr, function(v) {
476+
var w = +v;
477+
return w > 0 ? w : 0;
478+
});
479+
};
480+
469481
/** fills calcdata field (given by cdAttr) with traceAttr values
470482
* or function of traceAttr values (e.g. some fallback)
471483
*

src/traces/bar/arrays_to_calcdata.js

+7-7
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,24 @@
88

99
'use strict';
1010

11-
var mergeArray = require('../../lib').mergeArray;
11+
var Lib = require('../../lib');
1212

1313
// arrayOk attributes, merge them into calcdata array
1414
module.exports = function arraysToCalcdata(cd, trace) {
1515
for(var i = 0; i < cd.length; i++) cd[i].i = i;
1616

17-
mergeArray(trace.text, cd, 'tx');
18-
mergeArray(trace.hovertext, cd, 'htx');
17+
Lib.mergeArray(trace.text, cd, 'tx');
18+
Lib.mergeArray(trace.hovertext, cd, 'htx');
1919

2020
var marker = trace.marker;
2121
if(marker) {
22-
mergeArray(marker.opacity, cd, 'mo');
23-
mergeArray(marker.color, cd, 'mc');
22+
Lib.mergeArray(marker.opacity, cd, 'mo', true);
23+
Lib.mergeArray(marker.color, cd, 'mc');
2424

2525
var markerLine = marker.line;
2626
if(markerLine) {
27-
mergeArray(markerLine.color, cd, 'mlc');
28-
mergeArray(markerLine.width, cd, 'mlw');
27+
Lib.mergeArray(markerLine.color, cd, 'mlc');
28+
Lib.mergeArrayCastPositive(markerLine.width, cd, 'mlw');
2929
}
3030
}
3131
};

src/traces/bar/helpers.js

+10
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
var isNumeric = require('fast-isnumeric');
1212
var tinycolor = require('tinycolor2');
13+
var isArrayOrTypedArray = require('../../lib').isArrayOrTypedArray;
1314

1415
exports.coerceString = function(attributeDefinition, value, defaultValue) {
1516
if(typeof value === 'string') {
@@ -64,3 +65,12 @@ exports.getValue = function(arrayOrScalar, index) {
6465
else if(index < arrayOrScalar.length) value = arrayOrScalar[index];
6566
return value;
6667
};
68+
69+
exports.getLineWidth = function(trace, di) {
70+
var w =
71+
(0 < di.mlw) ? di.mlw :
72+
!isArrayOrTypedArray(trace.marker.line.width) ? trace.marker.line.width :
73+
0;
74+
75+
return w;
76+
};

src/traces/bar/hover.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ var Registry = require('../../registry');
1414
var Color = require('../../components/color');
1515

1616
var fillText = require('../../lib').fillText;
17+
var getLineWidth = require('./helpers').getLineWidth;
1718

1819
function hoverPoints(pointData, xval, yval, hovermode) {
1920
var barPointData = hoverOnBars(pointData, xval, yval, hovermode);
@@ -165,7 +166,7 @@ function hoverOnBars(pointData, xval, yval, hovermode) {
165166
function getTraceColor(trace, di) {
166167
var mc = di.mcc || trace.marker.color;
167168
var mlc = di.mlcc || trace.marker.line.color;
168-
var mlw = di.mlw || trace.marker.line.width;
169+
var mlw = getLineWidth(trace, di);
169170

170171
if(Color.opacity(mc)) return mc;
171172
else if(Color.opacity(mlc) && mlw) return mlc;

src/traces/bar/plot.js

+14-8
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ function plot(gd, plotinfo, cdModule, traceLayer, opts) {
6969
var isWaterfall = (trace.type === 'waterfall');
7070
var isFunnel = (trace.type === 'funnel');
7171
var isBar = (trace.type === 'bar');
72-
var shouldDisplayZeros = isBar || isFunnel;
72+
var shouldDisplayZeros = (isBar || isFunnel);
7373

7474
var adjustPixel = 0;
7575
if(isWaterfall && trace.connector.visible && trace.connector.mode === 'between') {
@@ -102,12 +102,19 @@ function plot(gd, plotinfo, cdModule, traceLayer, opts) {
102102
var y0 = xy[1][0];
103103
var y1 = xy[1][1];
104104

105-
var isBlank = di.isBlank = !(
106-
isNumeric(x0) && isNumeric(x1) &&
107-
isNumeric(y0) && isNumeric(y1) &&
108-
(x0 !== x1 || (shouldDisplayZeros && isHorizontal)) &&
109-
(y0 !== y1 || (shouldDisplayZeros && !isHorizontal))
105+
var isBlank = (
106+
x0 === x1 ||
107+
y0 === y1 ||
108+
!isNumeric(x0) ||
109+
!isNumeric(x1) ||
110+
!isNumeric(y0) ||
111+
!isNumeric(y1)
110112
);
113+
// display zeros if line.width > 0
114+
if(isBlank && shouldDisplayZeros && helpers.getLineWidth(trace, di) && (isHorizontal ? x1 - x0 === 0 : y1 - y0 === 0)) {
115+
isBlank = false;
116+
}
117+
di.isBlank = isBlank;
111118

112119
// in waterfall mode `between` we need to adjust bar end points to match the connector width
113120
if(adjustPixel) {
@@ -130,8 +137,7 @@ function plot(gd, plotinfo, cdModule, traceLayer, opts) {
130137
mc = cont.color;
131138
}
132139
} else {
133-
lw = (di.mlw + 1 || trace.marker.line.width + 1 ||
134-
(di.trace ? di.trace.marker.line.width : 0) + 1) - 1;
140+
lw = helpers.getLineWidth(trace, di);
135141
mc = di.mc || trace.marker.color;
136142
}
137143

Loading
Loading

0 commit comments

Comments
 (0)