def test_tick_locator(self, t): locator = mpl.dates.YearLocator(month=3, day=15) s = Temporal().tick(locator) a = PseudoAxis(s._setup(t, Coordinate())._matplotlib_scale) a.set_view_interval(0, 365) assert 73 in a.major.locator()
def test_label_formatter(self, t): formatter = mpl.dates.DateFormatter("%Y") s = Temporal().label(formatter) a = PseudoAxis(s._setup(t, Coordinate())._matplotlib_scale) a.set_view_interval(10, 1000) label, = a.major.formatter.format_ticks([100]) assert label == "1970"
def test_tick_upto(self, t, x): n = 8 ax = mpl.figure.Figure().subplots() Temporal().tick(upto=n)._setup(t, Coordinate(), ax.xaxis) locator = ax.xaxis.get_major_locator() assert set(locator.maxticks.values()) == {n}
def test_color_named_values(self, t, x): name = "viridis" cmap = color_palette(name, as_cmap=True) s = Temporal(name)._setup(t, Color()) normed = (x - x.min()) / (x.max() - x.min()) assert_array_equal(s(t), cmap(normed)[:, :3]) # FIXME RGBA
def test_interval_with_norm(self, t, x): norm = t[1], t[2] s = Temporal(norm=norm)._setup(t, IntervalProperty()) n = mpl.dates.date2num(norm) normed = (x - n[0]) / (n[1] - n[0]) assert_array_equal(s(t), normed)
def test_interval_with_range(self, t, x): values = (1, 3) s = Temporal((1, 3))._setup(t, IntervalProperty()) normed = (x - x.min()) / (x.max() - x.min()) expected = normed * (values[1] - values[0]) + values[0] assert_array_equal(s(t), expected)
def test_coordinate_axis(self, t, x): ax = mpl.figure.Figure().subplots() s = Temporal()._setup(t, Coordinate(), ax.xaxis) assert_array_equal(s(t), x) locator = ax.xaxis.get_major_locator() formatter = ax.xaxis.get_major_formatter() assert isinstance(locator, mpl.dates.AutoDateLocator) assert isinstance(formatter, mpl.dates.AutoDateFormatter)
def infer_scale(self, arg: Any, data: Series) -> Scale: """Given data and a scaling argument, initialize appropriate scale class.""" # TODO infer continuous based on log/sqrt etc? if isinstance(arg, (list, dict)): return Nominal(arg) elif variable_type(data) == "categorical": return Nominal(arg) elif variable_type(data) == "datetime": return Temporal(arg) # TODO other variable types else: return Continuous(arg)
def default_scale(self, data: Series) -> Scale: """Given data, initialize appropriate scale class.""" # TODO allow variable_type to be "boolean" if that's a scale? # TODO how will this handle data with units that can be treated as numeric # if passed through a registered matplotlib converter? var_type = variable_type(data, boolean_type="numeric") if var_type == "numeric": return Continuous() elif var_type == "datetime": return Temporal() # TODO others # time-based (TimeStamp, TimeDelta, Period) # boolean scale? else: return Nominal()
def test_label_concise(self, t, x): ax = mpl.figure.Figure().subplots() Temporal().label(concise=True)._setup(t, Coordinate(), ax.xaxis) formatter = ax.xaxis.get_major_formatter() assert isinstance(formatter, mpl.dates.ConciseDateFormatter)
def test_color_defaults(self, t, x): cmap = color_palette("ch:", as_cmap=True) s = Temporal()._setup(t, Color()) normed = (x - x.min()) / (x.max() - x.min()) assert_array_equal(s(t), cmap(normed)[:, :3]) # FIXME RGBA
def test_interval_defaults(self, t, x): s = Temporal()._setup(t, IntervalProperty()) normed = (x - x.min()) / (x.max() - x.min()) assert_array_equal(s(t), normed)
def test_coordinate_defaults(self, t, x): s = Temporal()._setup(t, Coordinate()) assert_array_equal(s(t), x)