def _plot(self, x, y, z, scale): self.data_x, self.data_z, self.scale = x, z, scale if self.container.components: self.colors = map(lambda plot: plot.color, self.container.components) if self.last_flip_order != self.flip_order: self.colors.reverse() self.container.remove(*self.container.components) # Use a custom renderer so plot lines are clickable self.chaco_plot = Plot(self.data, renderer_map={ 'line': ClickableLinePlot }) self.chaco_plot.bgcolor = 'white' self.value_mapper = None self.index_mapper = None if len(self.data_x) == len(self.colors): colors = self.colors[:] else: colors = ['black'] * len(self.data_x) if self.flip_order: z = z[::-1] spacing = (z.max(axis=1) - z.min(axis=1)).min() * self.value_range offset = spacing * self.offset for i, (x_row, z_row) in enumerate(zip(x, z)): self.data.set_data('data_x_' + str(i), x_row) self.data.set_data('data_y_offset_' + str(i), z_row * self.value_range + offset * i) plots = self.chaco_plot.plot(('data_x_' + str(i), 'data_y_offset_' + str(i)), color=colors[i], type='line') plot = plots[0] self.container.add(plot) # Required for double-clicking plots plot.index.sort_order = 'ascending' plot.value.sort_order = 'ascending' if self.value_mapper is None: self.index_mapper = plot.index_mapper self.value_mapper = plot.value_mapper else: plot.value_mapper = self.value_mapper self.value_mapper.range.add(plot.value) plot.index_mapper = self.index_mapper self.index_mapper.range.add(plot.index) range = self.value_mapper.range range.high = (range.high - range.low) * self.value_range + range.low self.x_axis.mapper = self.index_mapper self.y_axis.mapper = self.value_mapper self.y_axis.title = 'Normalized intensity (%s)' % \ get_value_scale_label(scale) self.zoom_tool = ClickUndoZoomTool( plot, tool_mode="box", always_on=True, pointer="cross", drag_button=settings.zoom_button, undo_button=settings.undo_button, ) plot.overlays.append(self.zoom_tool) self.last_flip_order = self.flip_order return self.container
def _setup_plot_tools(self, plot): """Sets up the background, and several tools on a plot""" plot.bgcolor = "white" # The ZoomTool tool is stateful and allows drawing a zoom # box to select a zoom region. self.zoom_tool = ClickUndoZoomTool(plot, #self.zoom_tool = ZoomTool(plot, x_min_zoom_factor=-inf, y_min_zoom_factor=-inf, tool_mode="box", always_on=True, drag_button=settings.zoom_button, # undo_button=settings.undo_button, zoom_to_mouse=True) # The PanTool allows panning around the plot self.pan_tool = KeyboardPanTool(plot, drag_button=settings.pan_button, history_tool=self.zoom_tool) plot.tools.append(self.pan_tool) plot.overlays.append(self.zoom_tool) x_crossline = LineInspector(component=plot, axis='index_x', inspect_mode="indexed", is_listener=False, draw_mode='overlay', color="grey") y_crossline = LineInspector(component=plot, axis='index_y', inspect_mode="indexed", color="grey", draw_mode='overlay', is_listener=False) plot.overlays.append(x_crossline) plot.overlays.append(y_crossline) self.crosslines = (x_crossline, y_crossline) # The RangeSelectionTool tool is stateful and allows selection of a candidate # range for dataseries alignment. # plot.overlays.append(RangeSelectionOverlay(component=plot)) tool = SimpleInspectorTool(plot) plot.tools.append(tool) overlay = SimpleInspectorOverlay(component=plot, inspector=tool, align="lr") def formatter(**kw): return '(%.2f, %.2f)' % (kw['x'], kw['y']) overlay.field_formatters = [[formatter]] overlay.alternate_position = (-25, -25) plot.overlays.append(overlay) self.pointer_tool = PointerControlTool(component=plot, pointer='arrow') plot.tools.append(self.pointer_tool)
def __init__(self, *args, **kwargs): self.pairs = [ DatasetPair(first=d1, second=d2) for d1, d2 in kwargs['dataset_pairs'] ] self.pairs.sort(key=lambda pair: pair.first.name) self.range = kwargs.pop('range') super(PeakFitWindow, self).__init__(*args, **kwargs) self.table_editor.on_select = self._selection_changed self.selected = self.pairs[0] if self.pairs else None self.data = ArrayPlotData() self.plot = Plot(self.data) self.zoom_tool = ClickUndoZoomTool(self.plot, tool_mode="box", always_on=True, drag_button=settings.zoom_button, undo_button=settings.undo_button, zoom_to_mouse=True) self.plot.overlays.append(self.zoom_tool) for pair in self.pairs: self._plot_dataset(pair.first) self._plot_dataset(pair.second, offset=pair.peak_diff) self.plot.request_redraw()
def _plot(self, x, y, z, scale): pd = ArrayPlotData() pd.set_data("imagedata", z) plot = Plot(pd, padding_left=60, fill_padding=True) plot.bgcolor = 'white' cmap = fix(jet, (0, z.max())) origin = 'bottom left' # origin = 'top left' # to flip y-axis plot.img_plot("imagedata", name="surface2d", xbounds=(np.min(x), np.max(x)), ybounds=(1.0, y[-1,-1]), colormap=cmap, hide_grids=True, interpolation='nearest', origin=origin, ) plot.default_origin = origin plot.x_axis.title = u'Angle (2\u0398)' tick_font = settings.tick_font plot.x_axis.title_font = settings.axis_title_font plot.y_axis.title_font = settings.axis_title_font plot.x_axis.tick_label_font = tick_font plot.y_axis.tick_label_font = tick_font plot.y_axis.title = "Dataset" plot.y_axis.tick_interval = 1.0 actual_plot = plot.plots["surface2d"][0] self.plot_zoom_tool = ClickUndoZoomTool( plot, tool_mode="box", always_on=True, pointer="cross", drag_button=settings.zoom_button, undo_button=settings.undo_button, x_min_zoom_factor=-np.inf, y_min_zoom_factor=-np.inf, ) plot.overlays.append(self.plot_zoom_tool) plot.tools.append(TraitsTool(plot)) # Add a color bar colormap = actual_plot.color_mapper colorbar = ColorBar(index_mapper=LinearMapper(range=colormap.range), color_mapper=colormap, plot=actual_plot, orientation='v', resizable='v', width=30, padding=40, padding_top=50, fill_padding=True) colorbar._axis.title_font = settings.axis_title_font colorbar._axis.tick_label_font = settings.tick_font # Add pan and zoom tools to the colorbar self.colorbar_zoom_tool = ClickUndoZoomTool(colorbar, axis="index", tool_mode="range", always_on=True, drag_button=settings.zoom_button, undo_button=settings.undo_button) pan_tool = PanToolWithHistory(colorbar, history_tool=self.colorbar_zoom_tool, constrain_direction="y", constrain=True, drag_button=settings.pan_button) colorbar.tools.append(pan_tool) colorbar.overlays.append(self.colorbar_zoom_tool) # Add a label to the top of the color bar colorbar_label = PlotLabel( u'Intensity\n{:^9}'.format('(' + get_value_scale_label(scale) + ')'), component=colorbar, font=settings.axis_title_font, ) colorbar.overlays.append(colorbar_label) colorbar.tools.append(TraitsTool(colorbar)) # Add the plot and colorbar side-by-side container = HPlotContainer(use_backbuffer=True) container.add(plot) container.add(colorbar) return container