@@ -56,12 +56,14 @@ function setPositionOffset(traceType, gd, boxList, posAxis) {
56
56
57
57
var i , j , calcTrace ;
58
58
var pointList = [ ] ;
59
+ var shownPts = 0 ;
59
60
60
61
// make list of box points
61
62
for ( i = 0 ; i < boxList . length ; i ++ ) {
62
63
calcTrace = calcdata [ boxList [ i ] ] ;
63
64
for ( j = 0 ; j < calcTrace . length ; j ++ ) {
64
65
pointList . push ( calcTrace [ j ] . pos ) ;
66
+ shownPts += ( calcTrace [ j ] . pts2 || [ ] ) . length ;
65
67
}
66
68
}
67
69
@@ -92,7 +94,6 @@ function setPositionOffset(traceType, gd, boxList, posAxis) {
92
94
var t = calcTrace [ 0 ] . t ;
93
95
var width = trace . width ;
94
96
var side = trace . side ;
95
- var pointpos = trace . pointpos ;
96
97
97
98
// position coordinate delta
98
99
var dPos ;
@@ -118,53 +119,97 @@ function setPositionOffset(traceType, gd, boxList, posAxis) {
118
119
t . bdPos = bdPos ;
119
120
t . wHover = wHover ;
120
121
122
+ // box/violin-only value-space push value
123
+ var pushplus ;
124
+ var pushminus ;
125
+ // edge of box/violin
121
126
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 ;
128
129
129
130
if ( side === 'positive' ) {
130
- vpadplus = edge ;
131
- vpadminus = bPos ;
131
+ pushplus = dPos / 2 ;
132
+ edgeplus = edge ;
133
+ pushminus = edgeplus = bPos ;
132
134
} else if ( side === 'negative' ) {
133
- vpadplus = bPos ;
134
- vpadminus = edge ;
135
+ pushplus = edgeplus = bPos ;
136
+ pushminus = dPos / 2 ;
137
+ edgeminus = edge ;
135
138
} else {
136
- vpadplus = edge ;
137
- vpadminus = edge ;
139
+ pushplus = pushminus = dPos ;
140
+ edgeplus = edgeminus = edge ;
138
141
}
139
142
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 ;
141
156
var jitter = trace . jitter ;
142
157
var ms = trace . marker . size / 2 ;
143
158
159
+ var pp = 0 ;
144
160
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 ;
148
176
}
177
+
178
+ var pm = 0 ;
149
179
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
+ }
153
191
}
192
+ if ( pm <= pushminus ) {
193
+ // (<-) fallback to push value
194
+ vpadminus = pushminus ;
195
+ }
196
+
197
+ } else {
198
+ vpadplus = pushplus ;
199
+ vpadminus = pushminus ;
154
200
}
155
201
156
202
// calcdata[i][j] are in ascending order
157
203
var firstPos = calcTrace [ 0 ] . pos ;
158
204
var lastPos = calcTrace [ calcTrace . length - 1 ] . pos ;
159
205
160
206
trace . _extremes [ axId ] = Axes . findExtremes ( posAxis , [ firstPos , lastPos ] , {
207
+ padded : padded ,
161
208
vpadminus : vpadminus ,
162
209
vpadplus : vpadplus ,
163
210
// N.B. SVG px-space positive/negative
164
211
ppadminus : { x : ppadminus , y : ppadplus } [ axLetter ] ,
165
212
ppadplus : { x : ppadplus , y : ppadminus } [ axLetter ] ,
166
- // add 5% of both sides
167
- padded : true
168
213
} ) ;
169
214
}
170
215
}
0 commit comments