Add support for "humanized" axes tick values
							parent
							
								
									7d1a2e1e4d
								
							
						
					
					
						commit
						cec08f20ba
					
				| 
						 | 
					@ -18,7 +18,7 @@
 | 
				
			||||||
Chart axes graphics and behavior.
 | 
					Chart axes graphics and behavior.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
import functools
 | 
					from functools import partial
 | 
				
			||||||
from typing import List, Tuple, Optional
 | 
					from typing import List, Tuple, Optional
 | 
				
			||||||
from math import floor
 | 
					from math import floor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -29,6 +29,7 @@ from PyQt5.QtCore import QPointF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ._style import DpiAwareFont, hcolor, _font
 | 
					from ._style import DpiAwareFont, hcolor, _font
 | 
				
			||||||
from ..data._source import float_digits
 | 
					from ..data._source import float_digits
 | 
				
			||||||
 | 
					from ..calc import humanize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_axis_pen = pg.mkPen(hcolor('bracket'))
 | 
					_axis_pen = pg.mkPen(hcolor('bracket'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -92,6 +93,18 @@ class Axis(pg.AxisItem):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class PriceAxis(Axis):
 | 
					class PriceAxis(Axis):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __init__(
 | 
				
			||||||
 | 
					        self,
 | 
				
			||||||
 | 
					        *args,
 | 
				
			||||||
 | 
					        humanize: bool = True,
 | 
				
			||||||
 | 
					        digits: int = 2,
 | 
				
			||||||
 | 
					        **kwargs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ) -> None:
 | 
				
			||||||
 | 
					        super().__init__(*args, **kwargs)
 | 
				
			||||||
 | 
					        self.humanize = humanize
 | 
				
			||||||
 | 
					        self.digits = digits
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def size_to_values(self) -> None:
 | 
					    def size_to_values(self) -> None:
 | 
				
			||||||
        self.setWidth(self.typical_br.width())
 | 
					        self.setWidth(self.typical_br.width())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -103,20 +116,25 @@ class PriceAxis(Axis):
 | 
				
			||||||
        scale,
 | 
					        scale,
 | 
				
			||||||
        spacing,
 | 
					        spacing,
 | 
				
			||||||
    ):
 | 
					    ):
 | 
				
			||||||
 | 
					        # TODO: figure out how to enforce min tick spacing by passing it
 | 
				
			||||||
        # TODO: figure out how to enforce min tick spacing by passing
 | 
					        # into the parent type
 | 
				
			||||||
        # it into the parent type
 | 
					        digits = max(
 | 
				
			||||||
        digits = max(float_digits(spacing * scale), self._min_tick)
 | 
					            float_digits(spacing * scale),
 | 
				
			||||||
 | 
					            self._min_tick,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # print(f'vals: {vals}\nscale: {scale}\nspacing: {spacing}')
 | 
					        # print(f'vals: {vals}\nscale: {scale}\nspacing: {spacing}')
 | 
				
			||||||
        # print(f'digits: {digits}')
 | 
					        # print(f'digits: {digits}')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return [
 | 
					        if not self.humanize:
 | 
				
			||||||
            ('{value:,.{digits}f}').format(
 | 
					            return [
 | 
				
			||||||
                digits=digits,
 | 
					                ('{value:,.{digits}f}').format(
 | 
				
			||||||
                value=v,
 | 
					                    digits=digits,
 | 
				
			||||||
            ).replace(',', ' ') for v in vals
 | 
					                    value=v,
 | 
				
			||||||
        ]
 | 
					                ).replace(',', ' ') for v in vals
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            return list(map(partial(humanize, digits=self.digits), vals))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class DynamicDateAxis(Axis):
 | 
					class DynamicDateAxis(Axis):
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue