예제 #1
0
def quantity_converter():
    # Create an instance of the conversion interface and
    # mock so we can check methods called
    qc = munits.ConversionInterface()

    def convert(value, unit, axis):
        if hasattr(value, 'units'):
            return value.to(unit).magnitude
        elif np.iterable(value):
            try:
                return [v.to(unit).magnitude for v in value]
            except AttributeError:
                return [Quantity(v, axis.get_units()).to(unit).magnitude
                        for v in value]
        else:
            return Quantity(value, axis.get_units()).to(unit).magnitude

    def default_units(value, axis):
        if hasattr(value, 'units'):
            return value.units
        elif np.iterable(value):
            for v in value:
                if hasattr(v, 'units'):
                    return v.units
            return None

    qc.convert = MagicMock(side_effect=convert)
    qc.axisinfo = MagicMock(side_effect=lambda u, a: munits.AxisInfo(label=u))
    qc.default_units = MagicMock(side_effect=default_units)
    return qc
예제 #2
0
    def axisinfo(unit, axis):
        """: Returns information on how to handle an axis that has Epoch data.

        = INPUT VARIABLES
        - unit     The units to use for a axis with Epoch data.

        = RETURN VALUE
        - Returns a matplotlib AxisInfo data structure that contains
          minor/major formatters, major/minor locators, and default
          label information.
        """
        # 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)
예제 #3
0
    def axisinfo(unit, axis):
        if unit != 'time':
            return None

        majloc = AutoLocator()
        majfmt = TimeFormatter(majloc)
        return units.AxisInfo(majloc=majloc, majfmt=majfmt, label='time')
예제 #4
0
 def axisinfo(unit, axis):
     if unit == u.radian:
         return units.AxisInfo(
             majloc=ticker.MultipleLocator(base=np.pi / 2),
             majfmt=ticker.FuncFormatter(rad_fn),
             label=unit.to_string(),
         )
     elif unit == u.degree:
         return units.AxisInfo(
             majloc=ticker.AutoLocator(),
             majfmt=ticker.FormatStrFormatter('%i°'),
             label=unit.to_string(),
         )
     elif unit is not None:
         return units.AxisInfo(label=unit.to_string(format))
     return None
예제 #5
0
    def axisinfo(unit, axis):
        """
        Returns the :class:`~matplotlib.units.AxisInfo` for *unit*.

        *unit* is a tzinfo instance or None.
        The *axis* argument is required but not used.
        """
        calendar, date_unit, date_type = unit

        majloc = NetCDFTimeDateLocator(4,
                                       calendar=calendar,
                                       date_unit=date_unit)
        majfmt = NetCDFTimeDateFormatter(majloc,
                                         calendar=calendar,
                                         time_units=date_unit)
        if date_type is CalendarDateTime:
            datemin = CalendarDateTime(cftime.datetime(2000, 1, 1),
                                       calendar=calendar)
            datemax = CalendarDateTime(cftime.datetime(2010, 1, 1),
                                       calendar=calendar)
        else:
            datemin = date_type(2000, 1, 1)
            datemax = date_type(2010, 1, 1)
        return munits.AxisInfo(majloc=majloc,
                               majfmt=majfmt,
                               label='',
                               default_limits=(datemin, datemax))
예제 #6
0
    def axisinfo(unit, axis) -> units.AxisInfo | None:
        if unit != "time":
            return None

        majloc = AutoLocator()
        majfmt = TimeFormatter(majloc)
        return units.AxisInfo(majloc=majloc, majfmt=majfmt, label="time")
예제 #7
0
    def axisinfo(unit, axis):
        """
        Set the default axis ticks and labels.

        Parameters
        ----------
        unit : `.UnitData`
            object string unit information for value
        axis : `~matplotlib.axis.Axis`
            axis for which information is being set

            .. note:: *axis* is not used

        Returns
        -------
        `~matplotlib.units.AxisInfo`
            Information to support default tick labeling

        """
        StrCategoryConverter._validate_unit(unit)
        # locator and formatter take mapping dict because
        # args need to be pass by reference for updates
        majloc = StrCategoryLocator(unit._mapping)
        majfmt = StrCategoryFormatter(unit._mapping)
        return units.AxisInfo(majloc=majloc, majfmt=majfmt)
예제 #8
0
 def axisinfo(self, unit, axis):
     """
     Return major and minor tick locators and formatters.
     """
     majloc = AstropyTimeLocator(self)
     majfmt = AstropyTimeFormatter(self)
     return units.AxisInfo(majfmt=majfmt,
                           majloc=majloc,
                           label=f'Time ({self.scale})')
예제 #9
0
    def axisinfo(self, unit, axis):
        # docstring inherited
        majloc = AutoTimedeltaLocator()
        majfmt = ConciseTimedeltaFormatter(majloc, **self.formatter_args)
        datemin = datetime.timedelta(days=1)
        datemax = datetime.timedelta(days=2)

        return units.AxisInfo(majloc=majloc,
                              majfmt=majfmt,
                              label='',
                              default_limits=(datemin, datemax))
예제 #10
0
    def axisinfo(unit, axis):
        'return the Foo AxisInfo'
        if unit == 1.0 or unit == 2.0:
            return units.AxisInfo(
                majloc=ticker.IndexLocator(4, 0),
                majfmt=ticker.FormatStrFormatter("VAL: %s"),
                label='foo',
            )

        else:
            return None
예제 #11
0
파일: dates.py 프로젝트: jtomase/matplotlib
 def axisinfo(unit):
     'return the unit AxisInfo'
     if unit=='date':
         majloc = AutoDateLocator()
         majfmt = AutoDateFormatter(majloc)
         return units.AxisInfo(
             majloc = majloc,
             majfmt = majfmt,
             label='date',
             )
     else: return None
예제 #12
0
    def axisinfo(unit, axis):
        'return the unit AxisInfo'
        # make sure that the axis does not start at 0

        majloc = AutoDateLocator(tz=unit)
        majfmt = AutoDateFormatter(majloc, tz=unit)
        datemin = datetime.date(2000, 1, 1)
        datemax = datetime.date(2010, 1, 1)

        return units.AxisInfo( majloc=majloc, majfmt=majfmt, label='',
                               default_limits=(datemin, datemax))
예제 #13
0
    def axisinfo(unit, axis):
        'return AxisInfo instance for x and unit'

        if unit == radians:
            return units.AxisInfo(
                majloc=ticker.MultipleLocator(base=np.pi/2),
                majfmt=ticker.FuncFormatter(rad_fn),
                label=unit.fullname,
            )
        elif unit == degrees:
            return units.AxisInfo(
                majloc=ticker.AutoLocator(),
                majfmt=ticker.FormatStrFormatter(r'$%i^\circ$'),
                label=unit.fullname,
            )
        elif unit is not None:
            if hasattr(unit, 'fullname'):
                return units.AxisInfo(label=unit.fullname)
            elif hasattr(unit, 'unit'):
                return units.AxisInfo(label=unit.unit.fullname)
        return None
예제 #14
0
    def axisinfo(self, unit, axis):
        """
        Return the `~matplotlib.units.AxisInfo`.

        The *unit* and *axis* arguments are required but not used.
        """
        majloc = AutoTimedeltaLocator()
        majfmt = AutoTimedeltaFormatter(majloc, **self.formatter_args)
        datemin = datetime.timedelta(days=1)
        datemax = datetime.timedelta(days=2)

        return units.AxisInfo(majloc=majloc,
                              majfmt=majfmt,
                              label='',
                              default_limits=(datemin, datemax))
    def axisinfo(unit, axis):
        """: Returns information on how to handle an axis that has Epoch data.

        = INPUT VARIABLES
        - unit     The units to use for a axis with Epoch data.

        = RETURN VALUE
        - Returns a matplotlib AxisInfo data structure that contains
          minor/major formatters, major/minor locators, and default
          label information.
        """

        majloc = date_ticker.AutoDateLocator()
        majfmt = date_ticker.AutoDateFormatter(majloc)

        return units.AxisInfo(majloc=majloc, majfmt=majfmt, label=unit)
예제 #16
0
    def axisinfo(unit, axis):
        """
        Return the :class:`~matplotlib.units.AxisInfo` for *unit*.

        *unit* is a tzinfo instance or None.
        The *axis* argument is required but not used.
        """
        tz = unit

        majloc = PandasAutoDateLocator(tz=tz)
        majfmt = PandasAutoDateFormatter(majloc, tz=tz)
        datemin = pydt.date(2000, 1, 1)
        datemax = pydt.date(2010, 1, 1)

        return units.AxisInfo(majloc=majloc, majfmt=majfmt, label='',
                              default_limits=(datemin, datemax))
예제 #17
0
def test_numpy_facade():
    # Create an instance of the conversion interface and
    # mock so we can check methods called
    qc = munits.ConversionInterface()

    def convert(value, unit, axis):
        if hasattr(value, 'units'):
            return value.to(unit).magnitude
        elif iterable(value):
            try:
                return [v.to(unit).magnitude for v in value]
            except AttributeError:
                return [
                    Quantity(v, axis.get_units()).to(unit).magnitude
                    for v in value
                ]
        else:
            return Quantity(value, axis.get_units()).to(unit).magnitude

    qc.convert = MagicMock(side_effect=convert)
    qc.axisinfo = MagicMock(side_effect=lambda u, a: munits.AxisInfo(label=u))
    qc.default_units = MagicMock(side_effect=lambda x, a: x.units)

    # Register the class
    munits.registry[Quantity] = qc

    # Simple test
    y = Quantity(np.linspace(0, 30), 'miles')
    x = Quantity(np.linspace(0, 5), 'hours')

    fig, ax = plt.subplots()
    fig.subplots_adjust(left=0.15)  # Make space for label
    ax.plot(x, y, 'tab:blue')
    ax.axhline(Quantity(26400, 'feet'), color='tab:red')
    ax.axvline(Quantity(120, 'minutes'), color='tab:green')
    ax.yaxis.set_units('inches')
    ax.xaxis.set_units('seconds')

    assert qc.convert.called
    assert qc.axisinfo.called
    assert qc.default_units.called
예제 #18
0
    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)
예제 #19
0
    def axisinfo(unit, axis):
        """
        Return the :class:`~matplotlib.units.AxisInfo` for *unit*.

        *unit* is a tzinfo instance or None.
        The *axis* argument is required but not used.
        """
        calendar, date_unit = unit

        majloc = NetCDFTimeDateLocator(4,
                                       calendar=calendar,
                                       date_unit=date_unit)
        majfmt = NetCDFTimeDateFormatter(majloc,
                                         calendar=calendar,
                                         time_units=date_unit)
        datemin = netcdftime.datetime(2000, 1, 1)
        datemax = netcdftime.datetime(2010, 1, 1)
        datemin.calendar = datemax.calendar = calendar
        return munits.AxisInfo(majloc=majloc,
                               majfmt=majfmt,
                               label='Testing',
                               default_limits=(datemin, datemax))
예제 #20
0
    def axisinfo(unit, axis):
        """Sets the default axis ticks and labels

        Parameters
        ---------
        unit : :class:`.UnitData`
            object string unit information for value
        axis : :class:`~matplotlib.Axis.axis`
            axis for which information is being set

        Returns
        -------
        :class:~matplotlib.units.AxisInfo~
            Information to support default tick labeling

        .. note: axis is not used
        """
        # locator and formatter take mapping dict because
        # args need to be pass by reference for updates
        majloc = StrCategoryLocator(unit._mapping)
        majfmt = StrCategoryFormatter(unit._mapping)
        return units.AxisInfo(majloc=majloc, majfmt=majfmt)
예제 #21
0
파일: dates.py 프로젝트: jtomase/matplotlib
    def axisinfo(unit, axis):
        'return the unit AxisInfo'
        # make sure that the axis does not start at 0
        if axis:
            ax = axis.axes

            if axis is ax.get_xaxis():
                xmin, xmax = ax.dataLim.intervalx
                if xmin == 0.:
                    # no data has been added - let's set the default datalim.
                    # We should probably use a better proxy for the datalim
                    # have been updated than the ignore setting
                    dmax = today = datetime.date.today()
                    dmin = today - datetime.timedelta(days=10)

                    ax._process_unit_info(xdata=(dmin, dmax))
                    dmin, dmax = ax.convert_xunits([dmin, dmax])

                    ax.viewLim.intervalx = dmin, dmax
                    ax.dataLim.intervalx = dmin, dmax
            elif axis is ax.get_yaxis():
                ymin, ymax = ax.dataLim.intervaly
                if ymin == 0.:
                    # no data has been added - let's set the default datalim.
                    # We should probably use a better proxy for the datalim
                    # have been updated than the ignore setting
                    dmax = today = datetime.date.today()
                    dmin = today - datetime.timedelta(days=10)

                    ax._process_unit_info(ydata=(dmin, dmax))
                    dmin, dmax = ax.convert_yunits([dmin, dmax])

                    ax.viewLim.intervaly = dmin, dmax
                    ax.dataLim.intervaly = dmin, dmax

        majloc = AutoDateLocator(tz=unit)
        majfmt = AutoDateFormatter(majloc, tz=unit)
        return units.AxisInfo(majloc=majloc, majfmt=majfmt, label='')
예제 #22
0
    def axisinfo(unit, axis):
        """: Returns information on how to handle an axis that has Epoch data.

      = INPUT VARIABLES
      - unit    The units to use for a axis with Epoch data.

      = RETURN VALUE
      - Returns a matplotlib AxisInfo data structure that contains
        minor/major formatters, major/minor locators, and default
        label information.
      """
        # Delay-load due to circular dependencies.
        import mplTest.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):
            if (isinstance(unit, str)):
                label = unit
            else:
                label = unit.label()
        else:
            label = None

        if (label == "rad"):
            # If the axis units are in radians, then use a special function for
            # applying format control.
            majfmt = ticker.FuncFormatter(rad_fn)
        elif (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)
예제 #23
0
 def axisinfo(unit, axis):
     majloc = dates.AutoDateLocator()
     majfmt = dates.AutoDateFormatter(majloc)
     return units.AxisInfo(majloc=majloc,
                           majfmt=majfmt)
예제 #24
0
 def axisinfo(unit, axis):
     seq, locs = zip(*axis.unit_data)
     majloc = StrCategoryLocator(locs)
     majfmt = StrCategoryFormatter(seq)
     return units.AxisInfo(majloc=majloc, majfmt=majfmt)
예제 #25
0
 def axisinfo(unit, axis):
     # docstring inherited
     majloc = date_ticker.AutoDateLocator()
     majfmt = date_ticker.AutoDateFormatter(majloc)
     return units.AxisInfo(majloc=majloc, majfmt=majfmt, label=unit)
예제 #26
0
 def axisinfo(unit, axis):
     majloc = StrCategoryLocator(axis.unit_data.locs)
     majfmt = StrCategoryFormatter(axis.unit_data.seq)
     return units.AxisInfo(majloc=majloc, majfmt=majfmt)
예제 #27
0
파일: plot.py 프로젝트: mwcraig/physipy
 def axisinfo(q_unit, axis):
     if axis.units is not None:
         if not q_unit.dimension == axis.units.dimension:
             raise DimensionError(q_unit.dimension, axis.units.dimension)
     return munits.AxisInfo(label='{}'.format(q_unit.symbol))