def test_selection_expr_stream_hist_invert_axes(self): # Create SelectionExpr on element hist = Histogram(([1, 2, 3, 4, 5], [1, 5, 2, 3, 7])).opts(invert_axes=True) expr_stream = SelectionExpr(hist) # Check stream properties self.assertEqual(len(expr_stream.input_streams), 1) self.assertIsInstance(expr_stream.input_streams[0], SelectionXY) self.assertIsNone(expr_stream.bbox) self.assertIsNone(expr_stream.selection_expr) # Simulate interactive update by triggering source stream. # Select second and forth bar. expr_stream.input_streams[0].event(bounds=(2.5, 1.5, 6, 4.6)) self.assertEqual(repr(expr_stream.selection_expr), repr((dim('x') >= 1.5) & (dim('x') <= 4.6))) self.assertEqual(expr_stream.bbox, {'x': (1.5, 4.6)}) # Select third, forth, and fifth bar. Make sure there is special # handling when last bar is selected to include values exactly on the # upper edge in the selection expr_stream.input_streams[0].event(bounds=(-10, 2.5, 10, 8)) self.assertEqual(repr(expr_stream.selection_expr), repr((dim('x') >= 2.5) & (dim('x') <= 8))) self.assertEqual(expr_stream.bbox, {'x': (2.5, 8)})
def test_selection_expr_stream_hist_invert_xaxis_yaxis(self): # Create SelectionExpr on element hist = Histogram(([1, 2, 3, 4, 5], [1, 5, 2, 3, 7])).opts( invert_xaxis=True, invert_yaxis=True, ) expr_stream = SelectionExpr(hist) # Check stream properties self.assertEqual(len(expr_stream._source_streams), 1) self.assertIsInstance(expr_stream._source_streams[0], SelectionXY) self.assertIsNone(expr_stream.bbox) self.assertIsNone(expr_stream.selection_expr) # Simulate interactive update by triggering source stream. # Select second and forth bar. expr_stream._source_streams[0].event(bounds=(4.6, 6, 1.5, 2.5)) self.assertEqual(repr(expr_stream.selection_expr), repr(dim('x').digitize(hist.edges).isin([2, 4]))) self.assertEqual(expr_stream.bbox, {'x': (1.5, 4.5)}) # Select third, forth, and fifth bar. Make sure there is special # handling when last bar is selected to include values exactly on the # upper edge in the selection expr_stream._source_streams[0].event(bounds=(8, 10, 2.5, -10)) self.assertEqual( repr(expr_stream.selection_expr), repr((dim('x').digitize(hist.edges).isin([3, 4, 5])) | (dim('x') == hist.edges[-1]))) self.assertEqual(expr_stream.bbox, {'x': (2.5, 5.5)})
def test_histogram_padding_square_positive(self): points = Histogram([(1, 2), (2, 1), (3, 3)]).options(padding=0.1) plot = bokeh_renderer.get_plot(points) x_range, y_range = plot.handles['x_range'], plot.handles['y_range'] self.assertEqual(x_range.start, 0.19999999999999996) self.assertEqual(x_range.end, 3.8) self.assertEqual(y_range.start, 0) self.assertEqual(y_range.end, 3.2)
def test_histogram_padding_nonsquare(self): histogram = Histogram([(1, 2), (2, 1), (3, 3)]).options(padding=0.1, width=600) plot = bokeh_renderer.get_plot(histogram) x_range, y_range = plot.handles['x_range'], plot.handles['y_range'] self.assertEqual(x_range.start, 0.35) self.assertEqual(x_range.end, 3.65) self.assertEqual(y_range.start, 0) self.assertEqual(y_range.end, 3.2)
def test_histogram_line_width_op(self): histogram = Histogram([(0, 0, 1), (0, 1, 4), (0, 2, 8)], vdims=['y', 'line_width']).options(line_width='line_width') plot = bokeh_renderer.get_plot(histogram) cds = plot.handles['cds'] glyph = plot.handles['glyph'] self.assertEqual(cds.data['line_width'], np.array([1, 4, 8])) self.assertEqual(glyph.line_width, {'field': 'line_width'})
def test_histogram_alpha_op(self): histogram = Histogram([(0, 0, 0), (0, 1, 0.2), (0, 2, 0.7)], vdims=['y', 'alpha']).options(alpha='alpha') plot = bokeh_renderer.get_plot(histogram) cds = plot.handles['cds'] glyph = plot.handles['glyph'] self.assertEqual(cds.data['alpha'], np.array([0, 0.2, 0.7])) self.assertEqual(glyph.fill_alpha, {'field': 'alpha'})
def test_histogram_padding_square_negative(self): points = Histogram([(1, -2), (2, -1), (3, -3)]).options(padding=0.1) plot = mpl_renderer.get_plot(points) x_range, y_range = plot.handles['axis'].get_xlim(), plot.handles['axis'].get_ylim() self.assertEqual(x_range[0], 0.19999999999999996) self.assertEqual(x_range[1], 3.8) self.assertEqual(y_range[0], -3.2) self.assertEqual(y_range[1], 0)
def test_histogram_padding_nonsquare(self): histogram = Histogram([(1, 2), (2, 1), (3, 3)]).options(padding=0.1, aspect=2) plot = mpl_renderer.get_plot(histogram) x_range, y_range = plot.handles['axis'].get_xlim(), plot.handles['axis'].get_ylim() self.assertEqual(x_range[0], 0.35) self.assertEqual(x_range[1], 3.65) self.assertEqual(y_range[0], 0) self.assertEqual(y_range[1], 3.2)
def test_histogram_color_op(self): histogram = Histogram([(0, 0, '#000000'), (0, 1, '#FF0000'), (0, 2, '#00FF00')], vdims=['y', 'color']).options(color='color') plot = mpl_renderer.get_plot(histogram) artist = plot.handles['artist'] children = artist.get_children() for c, w in zip(children, ['#000000', '#FF0000', '#00FF00']): self.assertEqual(c.get_facecolor(), tuple(c/255. for c in hex2rgb(w))+(1,))
def test_histogram_padding_logx(self): histogram = Histogram([(1, 1), (2, 2), (3,3)]).options(padding=0.1, logx=True) plot = mpl_renderer.get_plot(histogram) x_range, y_range = plot.handles['axis'].get_xlim(), plot.handles['axis'].get_ylim() self.assertEqual(x_range[0], 0.41158562699652224) self.assertEqual(x_range[1], 4.2518491541367327) self.assertEqual(y_range[0], 0) self.assertEqual(y_range[1], 3.2)
def test_histogram_line_width_op(self): histogram = Histogram([(0, 0, 1), (0, 1, 4), (0, 2, 8)], vdims=['y', 'line_width']).options(linewidth='line_width') plot = mpl_renderer.get_plot(histogram) artist = plot.handles['artist'] children = artist.get_children() for c, w in zip(children, np.array([1, 4, 8])): self.assertEqual(c.get_linewidth(), w)
def test_histogram_padding_logy(self): histogram = Histogram([(1, 2), (2, 1), (3, 3)]).options(padding=0.1, logy=True) plot = mpl_renderer.get_plot(histogram) x_range, y_range = plot.handles['axis'].get_xlim(), plot.handles['axis'].get_ylim() self.assertEqual(x_range[0], 0.19999999999999996) self.assertEqual(x_range[1], 3.8) self.assertEqual(y_range[0], 1) self.assertEqual(y_range[1], 3.3483695221017129)
def test_histogram_padding_logx(self): histogram = Histogram([(1, 1), (2, 2), (3,3)]).options(padding=0.1, logx=True) plot = bokeh_renderer.get_plot(histogram) x_range, y_range = plot.handles['x_range'], plot.handles['y_range'] self.assertEqual(x_range.start, 0.41158562699652224) self.assertEqual(x_range.end, 4.2518491541367327) self.assertEqual(y_range.start, 0) self.assertEqual(y_range.end, 3.2)
def test_histogram_color_op(self): histogram = Histogram([(0, 0, '#000'), (0, 1, '#F00'), (0, 2, '#0F0')], vdims=['y', 'color']).options(color='color') plot = bokeh_renderer.get_plot(histogram) cds = plot.handles['cds'] glyph = plot.handles['glyph'] self.assertEqual(cds.data['color'], np.array(['#000', '#F00', '#0F0'])) self.assertEqual(glyph.fill_color, {'field': 'color'}) self.assertEqual(glyph.line_color, 'black')
def test_histogram_padding_logy(self): histogram = Histogram([(1, 2), (2, 1), (3, 3)]).options(padding=0.1, logy=True) plot = bokeh_renderer.get_plot(histogram) x_range, y_range = plot.handles['x_range'], plot.handles['y_range'] self.assertEqual(x_range.start, 0.19999999999999996) self.assertEqual(x_range.end, 3.8) self.assertEqual(y_range.start, 0.033483695221017122) self.assertEqual(y_range.end, 3.3483695221017129)
def test_histogram_padding_logy(self): histogram = Histogram([(1, 2), (2, 1), (3, 3)]).options(padding=0.1, logy=True) plot = mpl_renderer.get_plot(histogram) x_range, y_range = plot.handles['axis'].get_xlim(), plot.handles['axis'].get_ylim() self.assertEqual(x_range[0], 0.19999999999999996) self.assertEqual(x_range[1], 3.8) self.assertEqual(y_range[0], 0.03348369522101712) self.assertEqual(y_range[1], 3.3483695221017129) self.log_handler.assertContains('WARNING', 'Logarithmic axis range encountered value less than')
def test_histogram_padding_logy(self): histogram = Histogram([(1, 2), (2, 1), (3, 3)]).options(padding=0.1, logy=True) plot = bokeh_renderer.get_plot(histogram) x_range, y_range = plot.handles['x_range'], plot.handles['y_range'] self.assertEqual(x_range.start, 0.19999999999999996) self.assertEqual(x_range.end, 3.8) self.assertEqual(y_range.start, 0.033483695221017122) self.assertEqual(y_range.end, 3.3483695221017129) self.log_handler.assertContains('WARNING', 'Logarithmic axis range encountered value less than')
def test_histogram_line_color_op(self): histogram = Histogram([(0, 0, '#000'), (0, 1, '#F00'), (0, 2, '#0F0')], vdims=['y', 'color']).options(edgecolor='color') plot = mpl_renderer.get_plot(histogram) artist = plot.handles['artist'] children = artist.get_children() self.assertEqual(children[0].get_edgecolor(), (0, 0, 0, 1)) self.assertEqual(children[1].get_edgecolor(), (1, 0, 0, 1)) self.assertEqual(children[2].get_edgecolor(), (0, 1, 0, 1))
def test_histogram_padding_datetime_nonsquare(self): histogram = Histogram([(np.datetime64('2016-04-0%d' % i, 'ns'), i) for i in range(1, 4)]).options( padding=0.1, aspect=2 ) plot = mpl_renderer.get_plot(histogram) x_range, y_range = plot.handles['axis'].get_xlim(), plot.handles['axis'].get_ylim() self.assertEqual(x_range[0], 16891.35) self.assertEqual(x_range[1], 16894.65) self.assertEqual(y_range[0], 0) self.assertEqual(y_range[1], 3.2)
def test_histogram_plot_styling(self): props = { 'color': 'orange', 'line_width': 7, 'line_color': 'green', } hist = Histogram((self.edges, self.frequencies)).opts(**props) state = self._get_plot_state(hist) marker = state['data'][0]['marker'] self.assert_property_values(marker, props)
def test_op_ndoverlay_value(self): colors = ['blue', 'red'] overlay = NdOverlay( { color: Histogram(np.arange(i + 2)) for i, color in enumerate(colors) }, 'Color').options('Histogram', fill_color='Color') plot = bokeh_renderer.get_plot(overlay) for subplot, color in zip(plot.subplots.values(), colors): self.assertEqual(subplot.handles['glyph'].fill_color, color)
def test_histogram_padding_datetime_nonsquare(self): histogram = Histogram([(np.datetime64('2016-04-0%d' % i, 'ns'), i) for i in range(1, 4)]).options( padding=0.1, width=600 ) plot = bokeh_renderer.get_plot(histogram) x_range, y_range = plot.handles['x_range'], plot.handles['y_range'] self.assertEqual(x_range.start, np.datetime64('2016-03-31T08:24:00.000000000')) self.assertEqual(x_range.end, np.datetime64('2016-04-03T15:36:00.000000000')) self.assertEqual(y_range.start, 0) self.assertEqual(y_range.end, 3.2)
def test_op_ndoverlay_value(self): colors = ['blue', 'red'] overlay = NdOverlay({color: Histogram(np.arange(i+2)) for i, color in enumerate(colors)}, 'Color').options( 'Histogram', facecolor='Color' ) plot = mpl_renderer.get_plot(overlay) colors = [(0, 0, 1, 1), (1, 0, 0, 1)] for subplot, color in zip(plot.subplots.values(), colors): children = subplot.handles['artist'].get_children() for c in children: self.assertEqual(c.get_facecolor(), color)
def test_histogram_categorical_color_op(self): histogram = Histogram([(0, 0, 'A'), (0, 1, 'B'), (0, 2, 'C')], vdims=['y', 'color']).options(color='color') plot = bokeh_renderer.get_plot(histogram) cds = plot.handles['cds'] glyph = plot.handles['glyph'] cmapper = plot.handles['color_color_mapper'] self.assertTrue(cmapper, CategoricalColorMapper) self.assertEqual(cmapper.factors, ['A', 'B', 'C']) self.assertEqual(cds.data['color'], np.array(['A', 'B', 'C'])) self.assertEqual(glyph.fill_color, {'field': 'color', 'transform': cmapper}) self.assertEqual(glyph.line_color, 'black')
def test_histogram_plot(self): hist = Histogram((self.edges, self.frequencies)) state = self._get_plot_state(hist) np.testing.assert_equal(state['data'][0]['x'], self.edges) np.testing.assert_equal(state['data'][0]['y'], self.frequencies) self.assertEqual(state['data'][0]['type'], 'bar') self.assertEqual(state['data'][0]['orientation'], 'v') self.assertEqual(state['data'][0]['width'], 1) self.assertEqual(state['layout']['xaxis']['range'], [-3.5, 2.5]) self.assertEqual(state['layout']['xaxis']['title']['text'], 'x') self.assertEqual(state['layout']['yaxis']['range'], [0, 5]) self.assertEqual(state['layout']['yaxis']['title']['text'], 'Frequency')
def test_histogram_linear_color_op(self): histogram = Histogram([(0, 0, 0), (0, 1, 1), (0, 2, 2)], vdims=['y', 'color']).options(color='color') plot = bokeh_renderer.get_plot(histogram) cds = plot.handles['cds'] glyph = plot.handles['glyph'] cmapper = plot.handles['color_color_mapper'] self.assertTrue(cmapper, LinearColorMapper) self.assertEqual(cmapper.low, 0) self.assertEqual(cmapper.high, 2) self.assertEqual(cds.data['color'], np.array([0, 1, 2])) self.assertEqual(glyph.fill_color, {'field': 'color', 'transform': cmapper}) self.assertEqual(glyph.line_color, 'black')
def cb(aname): x = np.linspace(0, 1, 10) y = np.random.randn(10) curve = Curve((x, y), group=aname) hist = Histogram(y) return (curve + hist).opts(shared_axes=False)
def setUp(self): self.values = np.arange(10) self.edges = np.arange(11) self.dataset1d = Histogram((self.edges, self.values))
class Binned1DTest(ComparisonTestCase): def setUp(self): self.values = np.arange(10) self.edges = np.arange(11) self.dataset1d = Histogram((self.edges, self.values)) def test_slice_all(self): sliced = self.dataset1d[:] self.assertEqual(sliced.values, self.values) self.assertEqual(sliced.edges, self.edges) def test_slice_exclusive_upper(self): "Exclusive upper boundary semantics for bin centers" sliced = self.dataset1d[:6.5] self.assertEqual(sliced.values, np.arange(6)) self.assertEqual(sliced.edges, np.arange(7)) def test_slice_exclusive_upper_exceeded(self): "Slightly above the boundary in the previous test" sliced = self.dataset1d[:6.55] self.assertEqual(sliced.values, np.arange(7)) self.assertEqual(sliced.edges, np.arange(8)) def test_slice_inclusive_lower(self): "Inclusive lower boundary semantics for bin centers" sliced = self.dataset1d[3.5:] self.assertEqual(sliced.values, np.arange(3, 10)) self.assertEqual(sliced.edges, np.arange(3, 11)) def test_slice_inclusive_lower_undershot(self): "Inclusive lower boundary semantics for bin centers" sliced = self.dataset1d[3.45:] self.assertEqual(sliced.values, np.arange(3, 10)) self.assertEqual(sliced.edges, np.arange(3, 11)) def test_slice_bounded(self): sliced = self.dataset1d[3.5:6.5] self.assertEqual(sliced.values, np.arange(3, 6)) self.assertEqual(sliced.edges, np.arange(3, 7)) def test_slice_lower_out_of_bounds(self): sliced = self.dataset1d[-3:] self.assertEqual(sliced.values, self.values) self.assertEqual(sliced.edges, self.edges) def test_slice_upper_out_of_bounds(self): sliced = self.dataset1d[:12] self.assertEqual(sliced.values, self.values) self.assertEqual(sliced.edges, self.edges) def test_slice_both_out_of_bounds(self): sliced = self.dataset1d[-3:13] self.assertEqual(sliced.values, self.values) self.assertEqual(sliced.edges, self.edges) def test_scalar_index(self): self.assertEqual(self.dataset1d[4.5], 4) self.assertEqual(self.dataset1d[3.7], 3) self.assertEqual(self.dataset1d[9.9], 9) def test_scalar_index_boundary(self): """ Scalar at boundary indexes next bin. (exclusive upper boundary for current bin) """ self.assertEqual(self.dataset1d[4], 4) self.assertEqual(self.dataset1d[5], 5) def test_scalar_lowest_index(self): self.assertEqual(self.dataset1d[0], 0) def test_scalar_lowest_index_out_of_bounds(self): with self.assertRaises(IndexError): self.dataset1d[-1] def test_scalar_highest_index_out_of_bounds(self): with self.assertRaises(IndexError): self.dataset1d[10] def test_groupby_kdim(self): grouped = self.dataset1d.groupby('x', group_type=Dataset) holomap = HoloMap({self.edges[i:i+2].mean(): Dataset([(i,)], vdims=['Frequency']) for i in range(10)}, kdims=['x']) self.assertEqual(grouped, holomap)
def test_histogram_alpha_op(self): histogram = Histogram([(0, 0, 0), (0, 1, 0.2), (0, 2, 0.7)], vdims=['y', 'alpha']).options(alpha='alpha') with self.assertRaises(Exception): mpl_renderer.get_plot(histogram)