def test_display_limits_are_reasonable_when_using_log_scale(self): test_ranges = (((-0.1, 11.0), (0.0, 100.0)), ((1000.0, 1100.0), (998.85, 1122.02)), ((1.0, 2.0), (0.99, 2.0)), ((3.0, 4.0), (2.98, 5.01)), ((2.0, 2.1), (2.0, 2.14)), ((0.0, 5.0), (0.05, 5.0))) for data_in, data_out in test_ranges: with self.subTest(data_in=data_in, data_out=data_out): data = numpy.linspace(data_in[0], data_in[1], 100, endpoint=False) data_style = "log" calibrated_data_min, calibrated_data_max, y_ticker = LineGraphCanvasItem.calculate_y_axis( [data], None, None, None, data_style) axes = LineGraphCanvasItem.LineGraphAxes(1.0, calibrated_data_min, calibrated_data_max, data_style=data_style, y_ticker=y_ticker) self.assertAlmostEqual(axes.uncalibrated_data_min, data_out[0], places=1) self.assertAlmostEqual(axes.uncalibrated_data_max, data_out[1], places=1) calibrated_data = axes.calculate_calibrated_xdata( DataAndMetadata.new_data_and_metadata(data)).data data[data <= 0] = numpy.nan self.assertAlmostEqual(numpy.nanmin(calibrated_data), math.log10(numpy.nanmin(data))) self.assertAlmostEqual(numpy.nanmax(calibrated_data), math.log10(numpy.nanmax(data)))
def test_narrow_line_plot_with_nans_is_drawn_properly(self): with TestContext.create_memory_context() as test_context: document_controller = test_context.create_document_controller() document_model = document_controller.document_model display_panel = document_controller.selected_display_panel data = numpy.random.rand(200) data[0] = numpy.nan data_item = DataItem.DataItem(data) data_item.set_xdata(DataAndMetadata.new_data_and_metadata(data)) document_model.append_data_item(data_item) display_item = document_model.get_display_item_for_data_item( data_item) display_panel.set_display_panel_display_item(display_item) display_panel.display_canvas_item.layout_immediate((100, 480)) axes = display_panel.display_canvas_item._axes drawing_context = DrawingContext.DrawingContext() calibrated_data_min = axes.calibrated_data_min calibrated_data_max = axes.calibrated_data_max calibrated_data_range = calibrated_data_max - calibrated_data_min display_xdata = display_panel.display_canvas_item.line_graph_canvas_item.calibrated_xdata LineGraphCanvasItem.draw_line_graph( drawing_context, 480, 100, 0, 0, display_xdata, calibrated_data_min, calibrated_data_range, axes.calibrated_left_channel, axes.calibrated_right_channel, axes.x_calibration, "black", "black", None, axes.data_style) # ensure that the drawing commands are sufficiently populated to have drawn the graph self.assertGreater(len(drawing_context.commands), 100)
def test_line_plot_handle_calibrated_x_axis_with_negative_scale(self): with TestContext.create_memory_context() as test_context: document_controller = test_context.create_document_controller() document_model = document_controller.document_model display_panel = document_controller.selected_display_panel data = numpy.random.randn(100) data_item = DataItem.DataItem(data) data_item.set_xdata( DataAndMetadata.new_data_and_metadata( data, dimensional_calibrations=[ Calibration.Calibration(0, -1.0, "e") ])) document_model.append_data_item(data_item) display_item = document_model.get_display_item_for_data_item( data_item) display_panel.set_display_panel_display_item(display_item) display_panel.display_canvas_item.layout_immediate((640, 480)) axes = display_panel.display_canvas_item._axes drawing_context = DrawingContext.DrawingContext() calibrated_data_min = axes.calibrated_data_min calibrated_data_max = axes.calibrated_data_max calibrated_data_range = calibrated_data_max - calibrated_data_min LineGraphCanvasItem.draw_line_graph( drawing_context, 480, 640, 0, 0, data_item.xdata, calibrated_data_min, calibrated_data_range, axes.calibrated_left_channel, axes.calibrated_right_channel, axes.x_calibration, "black", "black", None, axes.data_style) # ensure that the drawing commands are sufficiently populated to have drawn the graph self.assertGreater(len(drawing_context.commands), 100)
def test_display_limits_are_reasonable_when_using_log_scale(self): data = numpy.linspace(-0.1, 10.0, 10) data_style = "log" calibrated_data_min, calibrated_data_max, y_ticker = LineGraphCanvasItem.calculate_y_axis( [data], None, None, None, data_style) axes = LineGraphCanvasItem.LineGraphAxes(1.0, calibrated_data_min, calibrated_data_max, data_style=data_style, y_ticker=y_ticker) self.assertAlmostEqual(axes.uncalibrated_data_min, 1.0) self.assertAlmostEqual(axes.uncalibrated_data_max, 10.0) calibrated_data = axes.calculate_calibrated_xdata( DataAndMetadata.new_data_and_metadata(data)).data self.assertAlmostEqual(numpy.amin(calibrated_data), math.log10(1.0)) self.assertAlmostEqual(numpy.amax(calibrated_data), math.log10(10.0))
def test_data_values_give_pretty_limits_when_auto(self): test_ranges = ( ((7.46, 85.36), (0.0, 100.0)), ((7.67, 12.95), (0.0, 15.0)), ((6.67, 11.95), (0.0, 15.0)), ((0.00, 0.00), (-1.0, 1.0)) ) for data_in, data_out in test_ranges: data_min, data_max = data_in expected_uncalibrated_data_min, expected_uncalibrated_data_max = data_out data = numpy.zeros((16, 16), dtype=numpy.float64) irow, icol = numpy.ogrid[0:16, 0:16] data[:] = data_min + (data_max - data_min) * (irow / 15.0) # auto on min/max calibrated_data_min, calibrated_data_max, y_ticker = LineGraphCanvasItem.calculate_y_axis([data], None, None, None, None) axes = LineGraphCanvasItem.LineGraphAxes(1.0, calibrated_data_min, calibrated_data_max, y_ticker=y_ticker) self.assertEqual(axes.uncalibrated_data_min, expected_uncalibrated_data_min) self.assertEqual(axes.uncalibrated_data_max, expected_uncalibrated_data_max)
def test_display_limits_are_reasonable_when_using_calibrated_log_scale( self): intensity_calibration = Calibration.Calibration(-5, 2) data = numpy.linspace(-0.1, 10.0, 10) data_style = "log" calibrated_data_min, calibrated_data_max, y_ticker = LineGraphCanvasItem.calculate_y_axis( [data], None, None, intensity_calibration, data_style) axes = LineGraphCanvasItem.LineGraphAxes( 1.0, calibrated_data_min, calibrated_data_max, y_calibration=intensity_calibration, data_style=data_style, y_ticker=y_ticker) self.assertAlmostEqual(axes.calibrated_data_min, 0.0) self.assertAlmostEqual(axes.calibrated_data_max, 1.5) # empirically mesaured calibrated_data = axes.calculate_calibrated_xdata( DataAndMetadata.new_data_and_metadata(data)).data self.assertAlmostEqual(numpy.amin(calibrated_data), math.log10(1.0)) self.assertAlmostEqual(numpy.amax(calibrated_data), math.log10(15.0))
def test_check_exponents(self): e = LineGraphCanvasItem.Exponenter() e.add_label("5e+05") e.add_label("6e+05") self.assertEqual(("5 x 10", "5"), e.used_labels("5e+05")) self.assertEqual(("6 x 10", "5"), e.used_labels("6e+05")) e = LineGraphCanvasItem.Exponenter() e.add_label("5e+00") e.add_label("6e+00") self.assertEqual(("5", ""), e.used_labels("5e+00")) self.assertEqual(("6", ""), e.used_labels("6e+00")) e = LineGraphCanvasItem.Exponenter() e.add_label("5e+00") e.add_label("6e+05") self.assertEqual(("5 x 10", "0"), e.used_labels("5e+00")) self.assertEqual(("6 x 10", "5"), e.used_labels("6e+05")) e = LineGraphCanvasItem.Exponenter() e.add_label("1e+02") e.add_label("1e+05") self.assertEqual(("10", "2"), e.used_labels("1e+02")) self.assertEqual(("10", "5"), e.used_labels("1e+05")) e = LineGraphCanvasItem.Exponenter() e.add_label("5e-02") e.add_label("5e+00") self.assertEqual(("5 x 10", "-2"), e.used_labels("5e-02")) self.assertEqual(("5 x 10", "0"), e.used_labels("5e+00")) e = LineGraphCanvasItem.Exponenter() e.add_label("1e-03") e.add_label("1e+03") self.assertEqual(("10", "-3"), e.used_labels("1e-03")) self.assertEqual(("10", "3"), e.used_labels("1e+03"))
def test_line_plot_handles_data_below_one_in_log_scale(self): document_model = DocumentModel.DocumentModel() document_controller = DocumentController.DocumentController(self.app.ui, document_model, workspace_id="library") with contextlib.closing(document_controller): display_panel = document_controller.selected_display_panel data = numpy.random.rand(100) data_item = DataItem.DataItem(data) data_item.set_xdata(DataAndMetadata.new_data_and_metadata(data)) document_model.append_data_item(data_item) display_item = document_model.get_display_item_for_data_item(data_item) display_item.set_display_property("y_style", "log") display_panel.set_display_panel_display_item(display_item) display_panel.display_canvas_item.layout_immediate((640, 480)) axes = display_panel.display_canvas_item._axes self.assertEqual(axes.data_style, "log") drawing_context = DrawingContext.DrawingContext() calibrated_data_min = axes.calibrated_data_min calibrated_data_max = axes.calibrated_data_max calibrated_data_range = calibrated_data_max - calibrated_data_min display_xdata = display_panel.display_canvas_item.line_graph_canvas_item.calibrated_xdata LineGraphCanvasItem.draw_line_graph(drawing_context, 480, 640, 0, 0, display_xdata, calibrated_data_min, calibrated_data_range, axes.calibrated_left_channel, axes.calibrated_right_channel, axes.x_calibration, "black", "black", None, axes.data_style) # ensure that the drawing commands are sufficiently populated to have drawn the graph self.assertGreater(len(drawing_context.commands), 100)