|
155 | 155 | frommatplotlib.externalsimportsix |
156 | 156 |
|
157 | 157 | importdecimal |
| 158 | +importitertools |
158 | 159 | importlocale |
159 | 160 | importmath |
160 | 161 | importnumpyasnp |
@@ -565,36 +566,29 @@ def _compute_offset(self): |
565 | 566 | self.offset=0 |
566 | 567 | return |
567 | 568 | lmin,lmax=locs.min(),locs.max() |
568 | | -# min, max comparing absolute values (we want division to round towards |
569 | | -# zero so we work on absolute values). |
570 | | -abs_min,abs_max=sorted([abs(float(lmin)),abs(float(lmax))]) |
571 | 569 | # Only use offset if there are at least two ticks and every tick has |
572 | 570 | # the same sign. |
573 | 571 | iflmin==lmaxorlmin<=0<=lmax: |
574 | 572 | self.offset=0 |
575 | 573 | return |
| 574 | +# min, max comparing absolute values (we want division to round towards |
| 575 | +# zero so we work on absolute values). |
| 576 | +abs_min,abs_max=sorted([abs(float(lmin)),abs(float(lmax))]) |
576 | 577 | sign=math.copysign(1,lmin) |
577 | 578 | # What is the smallest power of ten such that abs_min and abs_max are |
578 | 579 | # equal up to that precision? |
579 | 580 | # Note: Internally using oom instead of 10 ** oom avoids some numerical |
580 | 581 | # accuracy issues. |
581 | | -oom=math.ceil(math.log10(abs_max)) |
582 | | -whileTrue: |
583 | | -ifabs_min//10**oom!=abs_max//10**oom: |
584 | | -oom+=1 |
585 | | -break |
586 | | -oom-=1 |
| 582 | +oom_max=math.ceil(math.log10(abs_max)) |
| 583 | +oom=1+next(oomforoominitertools.count(oom_max,-1) |
| 584 | +ifabs_min//10**oom!=abs_max//10**oom) |
587 | 585 | if (abs_max-abs_min)/10**oom<=1e-2: |
588 | 586 | # Handle the case of straddling a multiple of a large power of ten |
589 | 587 | # (relative to the span). |
590 | 588 | # What is the smallest power of ten such that abs_min and abs_max |
591 | | -# at most 1 apart? |
592 | | -oom=math.ceil(math.log10(abs_max)) |
593 | | -whileTrue: |
594 | | -ifabs_max//10**oom-abs_min//10**oom>1: |
595 | | -oom+=1 |
596 | | -break |
597 | | -oom-=1 |
| 589 | +# are no more than 1 apart at that precision? |
| 590 | +oom=1+next(oomforoominitertools.count(oom_max,-1) |
| 591 | +ifabs_max//10**oom-abs_min//10**oom>1) |
598 | 592 | # Only use offset if it saves at least two significant digits. |
599 | 593 | self.offset= (sign* (abs_max//10**oom)*10**oom |
600 | 594 | ifabs_max//10**oom>=10 |
|