Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit efe7e12

Browse files
authored
Merge pull request plotly#813 from tulip/boorstin-axes-ranges
Fix Axes.getAutoRange edge cases
2 parents 2a20e93 + bd40fb0 commit efe7e12

File tree

2 files changed

+467
-11
lines changed

2 files changed

+467
-11
lines changed

src/plots/cartesian/axes.js

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -172,14 +172,27 @@ axes.getAutoRange = function(ax) {
172172
}
173173

174174
if(minmin === maxmax) {
175-
newRange = axReverse ?
176-
[minmin + 1, ax.rangemode !== 'normal' ? 0 : minmin - 1] :
177-
[ax.rangemode !== 'normal' ? 0 : minmin - 1, minmin + 1];
175+
var lower = minmin - 1;
176+
var upper = minmin + 1;
177+
if(ax.rangemode === 'tozero') {
178+
newRange = minmin < 0 ? [lower, 0] : [0, upper];
179+
}
180+
else if(ax.rangemode === 'nonnegative') {
181+
newRange = [Math.max(0, lower), Math.max(0, upper)];
182+
}
183+
else {
184+
newRange = [lower, upper];
185+
}
178186
}
179187
else if(mbest) {
180188
if(ax.type === 'linear' || ax.type === '-') {
181-
if(ax.rangemode === 'tozero' && minbest.val >= 0) {
182-
minbest = {val: 0, pad: 0};
189+
if(ax.rangemode === 'tozero') {
190+
if(minbest.val >= 0) {
191+
minbest = {val: 0, pad: 0};
192+
}
193+
if(maxbest.val <= 0) {
194+
maxbest = {val: 0, pad: 0};
195+
}
183196
}
184197
else if(ax.rangemode === 'nonnegative') {
185198
if(minbest.val - mbest * minbest.pad < 0) {
@@ -193,22 +206,39 @@ axes.getAutoRange = function(ax) {
193206
// in case it changed again...
194207
mbest = (maxbest.val - minbest.val) /
195208
(ax._length - minbest.pad - maxbest.pad);
209+
196210
}
197211

198212
newRange = [
199213
minbest.val - mbest * minbest.pad,
200214
maxbest.val + mbest * maxbest.pad
201215
];
216+
}
202217

203-
// don't let axis have zero size
204-
if(newRange[0] === newRange[1]) {
218+
// don't let axis have zero size, while still respecting tozero and nonnegative
219+
if(newRange[0] === newRange[1]) {
220+
if(ax.rangemode === 'tozero') {
221+
if(newRange[0] < 0) {
222+
newRange = [newRange[0], 0];
223+
}
224+
else if(newRange[0] > 0) {
225+
newRange = [0, newRange[0]];
226+
}
227+
else {
228+
newRange = [0, 1];
229+
}
230+
}
231+
else {
205232
newRange = [newRange[0] - 1, newRange[0] + 1];
233+
if(ax.rangemode === 'nonnegative') {
234+
newRange[0] = Math.max(0, newRange[0]);
235+
}
206236
}
237+
}
207238

208-
// maintain reversal
209-
if(axReverse) {
210-
newRange.reverse();
211-
}
239+
// maintain reversal
240+
if(axReverse) {
241+
newRange.reverse();
212242
}
213243

214244
return newRange;

0 commit comments

Comments
 (0)