You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			86 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
"""UnitDblConverter module containing class UnitDblConverter."""
 | 
						|
 | 
						|
import numpy as np
 | 
						|
 | 
						|
from matplotlib import cbook, units
 | 
						|
import matplotlib.projections.polar as polar
 | 
						|
 | 
						|
__all__ = ['UnitDblConverter']
 | 
						|
 | 
						|
 | 
						|
# A special function for use with the matplotlib FuncFormatter class
 | 
						|
# for formatting axes with radian units.
 | 
						|
# This was copied from matplotlib example code.
 | 
						|
def rad_fn(x, pos=None):
 | 
						|
    """Radian function formatter."""
 | 
						|
    n = int((x / np.pi) * 2.0 + 0.25)
 | 
						|
    if n == 0:
 | 
						|
        return str(x)
 | 
						|
    elif n == 1:
 | 
						|
        return r'$\pi/2$'
 | 
						|
    elif n == 2:
 | 
						|
        return r'$\pi$'
 | 
						|
    elif n % 2 == 0:
 | 
						|
        return fr'${n//2}\pi$'
 | 
						|
    else:
 | 
						|
        return fr'${n}\pi/2$'
 | 
						|
 | 
						|
 | 
						|
class UnitDblConverter(units.ConversionInterface):
 | 
						|
    """
 | 
						|
    Provides Matplotlib conversion functionality for the Monte UnitDbl class.
 | 
						|
    """
 | 
						|
    # default for plotting
 | 
						|
    defaults = {
 | 
						|
       "distance": 'km',
 | 
						|
       "angle": 'deg',
 | 
						|
       "time": 'sec',
 | 
						|
       }
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def axisinfo(unit, axis):
 | 
						|
        # docstring inherited
 | 
						|
 | 
						|
        # Delay-load due to circular dependencies.
 | 
						|
        import matplotlib.testing.jpl_units as U
 | 
						|
 | 
						|
        # Check to see if the value used for units is a string unit value
 | 
						|
        # or an actual instance of a UnitDbl so that we can use the unit
 | 
						|
        # value for the default axis label value.
 | 
						|
        if unit:
 | 
						|
            label = unit if isinstance(unit, str) else unit.label()
 | 
						|
        else:
 | 
						|
            label = None
 | 
						|
 | 
						|
        if label == "deg" and isinstance(axis.axes, polar.PolarAxes):
 | 
						|
            # If we want degrees for a polar plot, use the PolarPlotFormatter
 | 
						|
            majfmt = polar.PolarAxes.ThetaFormatter()
 | 
						|
        else:
 | 
						|
            majfmt = U.UnitDblFormatter(useOffset=False)
 | 
						|
 | 
						|
        return units.AxisInfo(majfmt=majfmt, label=label)
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def convert(value, unit, axis):
 | 
						|
        # docstring inherited
 | 
						|
        if not cbook.is_scalar_or_string(value):
 | 
						|
            return [UnitDblConverter.convert(x, unit, axis) for x in value]
 | 
						|
        # If no units were specified, then get the default units to use.
 | 
						|
        if unit is None:
 | 
						|
            unit = UnitDblConverter.default_units(value, axis)
 | 
						|
        # Convert the incoming UnitDbl value/values to float/floats
 | 
						|
        if isinstance(axis.axes, polar.PolarAxes) and value.type() == "angle":
 | 
						|
            # Guarantee that units are radians for polar plots.
 | 
						|
            return value.convert("rad")
 | 
						|
        return value.convert(unit)
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def default_units(value, axis):
 | 
						|
        # docstring inherited
 | 
						|
        # Determine the default units based on the user preferences set for
 | 
						|
        # default units when printing a UnitDbl.
 | 
						|
        if cbook.is_scalar_or_string(value):
 | 
						|
            return UnitDblConverter.defaults[value.type()]
 | 
						|
        else:
 | 
						|
            return UnitDblConverter.default_units(value[0], axis)
 |