Skip to content

Commit bf6cfa2

Browse files
committedJan 8, 2019
new attempt for Box.crossTraceCalc
- use box/violin 'points' values to expand axes only when it is beyong box/violin spread - This makes the results more consistent with master, while still fixing numerous bugs.
1 parent 2aec059 commit bf6cfa2

File tree

1 file changed

+67
-22
lines changed

1 file changed

+67
-22
lines changed
 

Diff for: ‎src/traces/box/cross_trace_calc.js

+67-22
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,14 @@ function setPositionOffset(traceType, gd, boxList, posAxis) {
5656

5757
var i, j, calcTrace;
5858
var pointList = [];
59+
var shownPts = 0;
5960

6061
// make list of box points
6162
for(i = 0; i < boxList.length; i++) {
6263
calcTrace = calcdata[boxList[i]];
6364
for(j = 0; j < calcTrace.length; j++) {
6465
pointList.push(calcTrace[j].pos);
66+
shownPts += (calcTrace[j].pts2 || []).length;
6567
}
6668
}
6769

@@ -92,7 +94,6 @@ function setPositionOffset(traceType, gd, boxList, posAxis) {
9294
var t = calcTrace[0].t;
9395
var width = trace.width;
9496
var side = trace.side;
95-
var pointpos = trace.pointpos;
9697

9798
// position coordinate delta
9899
var dPos;
@@ -118,53 +119,97 @@ function setPositionOffset(traceType, gd, boxList, posAxis) {
118119
t.bdPos = bdPos;
119120
t.wHover = wHover;
120121

122+
// box/violin-only value-space push value
123+
var pushplus;
124+
var pushminus;
125+
// edge of box/violin
121126
var edge = bPos + bdPos;
122-
// data-space padding
123-
var vpadplus = 0;
124-
var vpadminus = 0;
125-
// pixel-space padding
126-
var ppadplus;
127-
var ppadminus;
127+
var edgeplus;
128+
var edgeminus;
128129

129130
if(side === 'positive') {
130-
vpadplus = edge;
131-
vpadminus = bPos;
131+
pushplus = dPos / 2;
132+
edgeplus = edge;
133+
pushminus = edgeplus = bPos;
132134
} else if(side === 'negative') {
133-
vpadplus = bPos;
134-
vpadminus = edge;
135+
pushplus = edgeplus = bPos;
136+
pushminus = dPos / 2;
137+
edgeminus = edge;
135138
} else {
136-
vpadplus = edge;
137-
vpadminus = edge;
139+
pushplus = pushminus = dPos;
140+
edgeplus = edgeminus = edge;
138141
}
139142

140-
if(trace.boxpoints || trace.points) {
143+
// value-space padding
144+
var vpadplus;
145+
var vpadminus;
146+
// pixel-space padding
147+
var ppadplus;
148+
var ppadminus;
149+
// do we add 5% of both sides (for points beyond box/violin)
150+
var padded = false;
151+
// does this trace show points?
152+
var hasPts = (trace.boxpoints || trace.points) && (shownPts > 0);
153+
154+
if(hasPts) {
155+
var pointpos = trace.pointpos;
141156
var jitter = trace.jitter;
142157
var ms = trace.marker.size / 2;
143158

159+
var pp = 0;
144160
if((pointpos + jitter) >= 0) {
145-
ppadplus = ms;
146-
var pp = bPos + bdPos * (pointpos + jitter);
147-
if(pp > vpadplus) vpadplus = pp;
161+
pp = edge * (pointpos + jitter);
162+
if(pp > pushplus) {
163+
// (++) beyond plus-value, use pp
164+
padded = true;
165+
ppadplus = ms;
166+
vpadplus = pp;
167+
} else if(pp > edgeplus) {
168+
// (+), use push-value (it's bigger), but add px-pad
169+
ppadplus = ms;
170+
vpadplus = pushplus;
171+
}
172+
}
173+
if(pp <= pushplus) {
174+
// (->) fallback to push value
175+
vpadplus = pushplus;
148176
}
177+
178+
var pm = 0;
149179
if((pointpos - jitter) <= 0) {
150-
ppadminus = ms;
151-
var pm = -bPos - bdPos * (pointpos - jitter);
152-
if(pm > vpadminus) vpadminus = pm;
180+
pm = -edge * (pointpos - jitter);
181+
if(pm > pushminus) {
182+
// (--) beyond plus-value, use pp
183+
padded = true;
184+
ppadminus = ms;
185+
vpadminus = pm;
186+
} else if(pm > edgeminus) {
187+
// (-), use push-value (it's bigger), but add px-pad
188+
ppadminus = ms;
189+
vpadminus = pushminus;
190+
}
153191
}
192+
if(pm <= pushminus) {
193+
// (<-) fallback to push value
194+
vpadminus = pushminus;
195+
}
196+
197+
} else {
198+
vpadplus = pushplus;
199+
vpadminus = pushminus;
154200
}
155201

156202
// calcdata[i][j] are in ascending order
157203
var firstPos = calcTrace[0].pos;
158204
var lastPos = calcTrace[calcTrace.length - 1].pos;
159205

160206
trace._extremes[axId] = Axes.findExtremes(posAxis, [firstPos, lastPos], {
207+
padded: padded,
161208
vpadminus: vpadminus,
162209
vpadplus: vpadplus,
163210
// N.B. SVG px-space positive/negative
164211
ppadminus: {x: ppadminus, y: ppadplus}[axLetter],
165212
ppadplus: {x: ppadplus, y: ppadminus}[axLetter],
166-
// add 5% of both sides
167-
padded: true
168213
});
169214
}
170215
}

0 commit comments

Comments
 (0)