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

Skip to content

Fix unit support with plot and pint #4803

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Sep 14, 2015
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Add test for unit conversion.
This is catching the problems with pint-like libraries who wrap numpy
arrays.
  • Loading branch information
dopplershift committed Sep 14, 2015
commit 0925e38fc9fbd004fdeece3695b57aa9955167bf
57 changes: 57 additions & 0 deletions lib/matplotlib/tests/test_units.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import matplotlib.pyplot as plt
import matplotlib.units as munits
import numpy as np

try:
# mock in python 3.3+
from unittest.mock import MagicMock
except ImportError:
from mock import MagicMock


# Tests that the conversion machinery works properly for classes that
# work as a facade over numpy arrays (like pint)
def test_numpy_facade():
# Basic class that wraps numpy array and has units
class Quantity(object):
def __init__(self, data, units):
self.magnitude = data
self.units = units

def to(self, new_units):
return Quantity(self.magnitude, new_units)

def __getattr__(self, attr):
return getattr(self.magnitude, attr)

def __getitem__(self, item):
return self.magnitude[item]

# 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)
else:
return Quantity(value, axis.get_units()).to(unit).magnitude

qc.convert = MagicMock(side_effect=convert)
qc.axisinfo = MagicMock(return_value=None)
qc.default_units = MagicMock(side_effect=lambda x, a: x.units)

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

# Simple test
t = Quantity(np.linspace(0, 10), 'sec')
d = Quantity(30 * np.linspace(0, 10), 'm/s')

fig, ax = plt.subplots(1, 1)
l, = plt.plot(t, d)
ax.yaxis.set_units('inch')

assert qc.convert.called
assert qc.axisinfo.called
assert qc.default_units.called