class MatplotlibWidget(FigureCanvas): def __init__(self, parent=None): super(MatplotlibWidget, self).__init__(Figure()) #self.hide() self.setParent(parent) self.figure = Figure() self.canvas = FigureCanvas(self.figure) self.ax = self.figure.add_subplot(111) self.ax.yaxis.grid(color='gray', linestyle='dashed') def add_plot_line(self, x, y): self.ax.plot(x, y, 'r') def add_legend(self, list): #list of strings like "X1 = blaghlbah" self.figure.legend([x for x in list], loc='upper left') def draw_graph(self): self.figure.draw() def show_graph(self): self.figure.show() def plot_bar_graph(self): pass
def saveBackground(self, event): self.subplots_adjust(left=0.1, right=0.90, bottom=0.15, top=0.92, wspace=0.4, hspace=0.05) self.setDateFormat() self.parent.updateStyle() Figure.draw(self, event) self.parent.background = self.canvas.copy_from_bbox( self.parent.ax.bbox)
def draw(self, event): if self.editAxes: self.graph.userCustom() self.graph.colorStyle() self.formatDate() self.subplots_adjust(hspace=0.05) self.graph.hideExtraLines() self.setLineData() Figure.draw(self, event) self.graph.bck = self.saveBackground() self.graph.showExtraLines()
def draw(self, cr): dpi = 96 f = Figure(figsize=(self.width / dpi, self.height / dpi), dpi=dpi) ax = f.add_subplot(111) t = arange(0, 100, 1) s = self.values f.set_facecolor((0, 0, 0, 0)) ax.set_facecolor((0, 0, 0, 0)) f.subplots_adjust(wspace=0, top=1.0, bottom=0.0, left=0, right=1.0) ax.axis('off') ax.set_ylim([0, 100]) ax.fill_between(t, s, [0] * 100) renderer = RendererGTK3Cairo(f.dpi) renderer.set_context(cr) renderer.set_width_height(self.width, self.height) f.canvas = MockCanvas() # Monkey patch to reduce memory footprint. f.draw(renderer)
def print_result(self, print_context, render=True): figure = Figure(facecolor='white', figsize=(6,4.5)) figure.set_dpi(72) # Don't draw the frame, please. figure.set_frameon(False) canvas = _PlotResultCanvas(figure) axes = figure.add_subplot(111) self._replay(axes) width, height = figure.bbox.width, figure.bbox.height if render: cr = print_context.get_cairo_context() renderer = RendererCairo(figure.dpi) renderer.set_width_height(width, height) if hasattr(renderer, 'gc'): # matplotlib-0.99 and newer renderer.gc.ctx = cr else: # matplotlib-0.98 # RendererCairo.new_gc() does a restore to get the context back # to its original state after changes cr.save() renderer.ctx = cr figure.draw(renderer) if not hasattr(renderer, 'gc'): # matplotlib-0.98 # Reverse the save() we did before drawing cr.restore() return height
def print_result(self, print_context, render=True): figure = Figure(facecolor='white', figsize=(6, 4.5)) figure.set_dpi(72) # Don't draw the frame, please. figure.set_frameon(False) canvas = _PlotResultCanvas(figure) axes = figure.add_subplot(111) self._replay(axes) width, height = figure.bbox.width, figure.bbox.height if render: cr = print_context.get_cairo_context() renderer = RendererCairo(figure.dpi) renderer.set_width_height(width, height) if hasattr(renderer, 'gc'): # matplotlib-0.99 and newer renderer.gc.ctx = cr else: # matplotlib-0.98 # RendererCairo.new_gc() does a restore to get the context back # to its original state after changes cr.save() renderer.ctx = cr figure.draw(renderer) if not hasattr(renderer, 'gc'): # matplotlib-0.98 # Reverse the save() we did before drawing cr.restore() return height
def draw(self, canvas): """ Draw the Figure Wrapper to parent class function. Set also the key_press_event callback Parameter --------- canvas: Canvas Canvas to use to draw the figure Returns ------- tmp: Value returned by parent class function call """ tmp = MplFig.draw(self, canvas) if not self._kid: self._kid = self.canvas.mpl_connect('key_press_event', self._key) return tmp
class PlotWidget(custom_result.ResultWidget): __gsignals__ = { 'button-press-event': 'override', 'button-release-event': 'override', 'expose-event': 'override', 'size-allocate': 'override', 'unrealize': 'override' } def __init__(self, result): custom_result.ResultWidget.__init__(self) figsize=(DEFAULT_FIGURE_WIDTH, DEFAULT_FIGURE_HEIGHT) self.figure = Figure(facecolor='white', figsize=figsize) self.canvas = _PlotResultCanvas(self.figure) self.axes = self.figure.add_subplot(111) self.add_events(gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.BUTTON_RELEASE) self.cached_contents = None self.sidebar_width = -1 def do_expose_event(self, event): cr = self.window.cairo_create() if not self.cached_contents: self.cached_contents = cr.get_target().create_similar(cairo.CONTENT_COLOR, self.allocation.width, self.allocation.height) renderer = RendererCairo(self.figure.dpi) renderer.set_width_height(self.allocation.width, self.allocation.height) renderer.set_ctx_from_surface(self.cached_contents) self.figure.draw(renderer) # event.region is not bound: http://bugzilla.gnome.org/show_bug.cgi?id=487158 # gdk_context = gtk.gdk.CairoContext(renderer.ctx) # gdk_context.region(event.region) # gdk_context.clip() cr.set_source_surface(self.cached_contents, 0, 0) cr.paint() def do_size_allocate(self, allocation): if allocation.width != self.allocation.width or allocation.height != self.allocation.height: self.cached_contents = None gtk.DrawingArea.do_size_allocate(self, allocation) def do_unrealize(self): gtk.DrawingArea.do_unrealize(self) self.cached_contents = None def do_button_press_event(self, event): if event.button == 3: custom_result.show_menu(self, event, save_callback=self.__save) return True else: return True def do_button_release_event(self, event): return True def do_realize(self): gtk.DrawingArea.do_realize(self) cursor = gtk.gdk.Cursor(gtk.gdk.LEFT_PTR) self.window.set_cursor(cursor) def do_size_request(self, requisition): try: # matplotlib < 0.98 requisition.width = self.figure.bbox.width() requisition.height = self.figure.bbox.height() except TypeError: # matplotlib >= 0.98 requisition.width = self.figure.bbox.width requisition.height = self.figure.bbox.height def recompute_figure_size(self): width = (self.sidebar_width / self.figure.dpi) height = width / DEFAULT_ASPECT_RATIO self.figure.set_figwidth(width) self.figure.set_figheight(height) self.queue_resize() def sync_dpi(self, dpi): self.figure.set_dpi(dpi) if self.sidebar_width >= 0: self.recompute_figure_size() def set_sidebar_width(self, width): if self.sidebar_width == width: return self.sidebar_width = width if self.sidebar_width >= 0: self.recompute_figure_size() def sync_style(self, style): self.cached_contents = None matplotlib.rcParams['font.size'] = self.parent.style.font_desc.get_size() / pango.SCALE def __save(self, filename): # The save/restore here was added to matplotlib's after 0.90. We duplicate # it for compatibility with older versions. (The code would need modification # for 0.98 and newer, which is the reason for the particular version in the # check) version = [int(x) for x in matplotlib.__version__.split('.')] need_save = version[:2] < [0, 98] if need_save: orig_dpi = self.figure.dpi.get() orig_facecolor = self.figure.get_facecolor() orig_edgecolor = self.figure.get_edgecolor() try: self.canvas.print_figure(filename) finally: if need_save: self.figure.dpi.set(orig_dpi) self.figure.set_facecolor(orig_facecolor) self.figure.set_edgecolor(orig_edgecolor) self.figure.set_canvas(self.canvas)
class PlotContour(object): #=========================================================================== def __init__(self, orientation='vertical', hover_target=None, **kwargs): if orientation in ['v', 'vertical']: self.vertical_orientation = True else: self.vertical_orientation = False self.event_dict = {} self.targets = [] self.hover_target = hover_target self.legend = None self.prop_fig = kwargs self._setup_figure() # self._add_event_hover() #=========================================================================== def _setup_figure(self): self.fig = Figure(**self.prop_fig) self.ax = self.fig.add_subplot(111) # =========================================================================== def _add_event_hover(self): try: self.disconnect_event('motion_notify_event') self.disconnect_event('button_press_event') except: pass self.add_event('motion_notify_event', self._on_movement_hover) #=========================================================================== def reset_plot(self): self.fig.delaxes(self.ax) #=========================================================================== def add_target(self, target): if target not in self.targets: self.targets.append(target) def add_legend(self, **kwargs): self.legend = self.fig.legend(**kwargs) self.call_targets() #========================================================================== def add_event(self, event_type, event_function): if event_type in self.event_dict: print('Event already added') return self.event_dict[event_type] = {} self.event_dict[event_type]['event_type'] = event_type self.event_dict[event_type]['event_function'] = event_function self.event_dict[event_type]['object'] = self.fig.canvas.mpl_connect(event_type, event_function) #========================================================================== def disconnect_event(self, event_type): if event_type in self.event_dict: self.fig.canvas.mpl_disconnect(self.event_dict[event_type]['object']) self.event_dict.pop(event_type) #========================================================================== def disconnect_all_events(self): event_list = self.event_dict.keys() for event_type in event_list: self.disconnect_event(event_type) #=========================================================================== def get_xlim(self): return self.ax.get_xlim() #=========================================================================== def get_ylim(self): return self.ax.get_ylim() #=========================================================================== def _on_click(self, event): pass def _on_movement_hover(self, event): self.hover_x = event.xdata self.hover_y = event.ydata self.call_target_hover() def call_target_hover(self): if self.hover_target: self.hover_target() #=========================================================================== def call_targets(self): """ Target is the mostly connected to updating a tk canvas. """ if self.targets: for target in self.targets: target() else: self.fig.draw() self.fig.show() #=========================================================================== def set_x_grid(self, grid_on=True, sync_color_with_line_id='default'): self.ax.grid(grid_on, axis='x', linestyle=':') #=========================================================================== def set_y_grid(self, grid_on=True, sync_color_with_line_id='default'): self.ax.grid(grid_on, axis='y', linestyle=':') #=========================================================================== def zoom_to_data(self, call_targets=True): ax = self._get_ax_object(ax) if ax: ax.set_x_limits(call_targets=False) ax.set_y_limits(call_targets=False) if call_targets: self.call_range_targets() def _set_date_ticks(self): start_date, end_date = self.get_xlim() start_date = datetime.datetime.fromordinal(int(start_date)) end_date = datetime.datetime.fromordinal(int(end_date)) dt = end_date - start_date nr_days = dt.days if nr_days <= 30: loc = mdates.DayLocator() fmt = mdates.DateFormatter('%Y-%m-%d') elif nr_days <= 100: loc = mdates.DayLocator(bymonthday=[1, 15]) fmt = mdates.DateFormatter('%Y-%m-%d') elif nr_days <= 365: loc = mdates.MonthLocator() fmt = mdates.DateFormatter('%Y-%m-%d') else: loc = mdates.MonthLocator(bymonthday=2) fmt = mdates.DateFormatter('%Y-%m-%d') self.ax.xaxis.set_major_locator(loc) self.ax.xaxis.set_major_formatter(fmt) #=========================================================================== def set_x_limits(self, limits=[], call_targets=True): x_min, x_max = limits self.ax.set_xlim([x_min, x_max]) # self._set_date_ticks() try: self._set_date_ticks() except: pass if call_targets: self.call_targets() #=========================================================================== def set_y_limits(self, limits=[], call_targets=True): y_min, y_max = limits self.ax.set_xlim([y_min, y_max]) if call_targets: self.call_targets() #=========================================================================== def set_data(self, x=False, y=False, z=None, line_id='default', exclude_index=[], ax='first', call_targets=True, **kwargs): try: x = [pd.to_datetime(item) for item in x] except: pass X, Y = np.meshgrid(x, y) self.data = dict() self.data['x'] = x self.data['y'] = y self.data['X'] = X self.data['Y'] = Y self.data['Z'] = z self.ax.contourf(X, Y, z, kwargs.get('nr_levels', 50)) if self.hover_target: self._add_event_hover() self.call_targets() #=========================================================================== def set_label(self, label): if self.vertical_orientation: self.ax.set_y_label(label) else: self.ax.set_x_label(label)
class PlotWidget(custom_result.ResultWidget): __gsignals__ = { 'button-press-event': 'override', 'button-release-event': 'override', 'expose-event': 'override', 'size-allocate': 'override', 'unrealize': 'override' } def __init__(self, result): custom_result.ResultWidget.__init__(self) figsize = (DEFAULT_FIGURE_WIDTH, DEFAULT_FIGURE_HEIGHT) self.figure = Figure(facecolor='white', figsize=figsize) self.canvas = _PlotResultCanvas(self.figure) self.axes = self.figure.add_subplot(111) self.add_events(gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.BUTTON_RELEASE) self.cached_contents = None self.sidebar_width = -1 def do_expose_event(self, event): cr = self.window.cairo_create() if not self.cached_contents: self.cached_contents = cr.get_target().create_similar( cairo.CONTENT_COLOR, self.allocation.width, self.allocation.height) renderer = RendererCairo(self.figure.dpi) renderer.set_width_height(self.allocation.width, self.allocation.height) renderer.set_ctx_from_surface(self.cached_contents) self.figure.draw(renderer) # event.region is not bound: http://bugzilla.gnome.org/show_bug.cgi?id=487158 # gdk_context = gtk.gdk.CairoContext(renderer.ctx) # gdk_context.region(event.region) # gdk_context.clip() cr.set_source_surface(self.cached_contents, 0, 0) cr.paint() def do_size_allocate(self, allocation): if allocation.width != self.allocation.width or allocation.height != self.allocation.height: self.cached_contents = None gtk.DrawingArea.do_size_allocate(self, allocation) def do_unrealize(self): gtk.DrawingArea.do_unrealize(self) self.cached_contents = None def do_button_press_event(self, event): if event.button == 3: custom_result.show_menu(self, event, save_callback=self.__save) return True else: return True def do_button_release_event(self, event): return True def do_realize(self): gtk.DrawingArea.do_realize(self) cursor = gtk.gdk.Cursor(gtk.gdk.LEFT_PTR) self.window.set_cursor(cursor) def do_size_request(self, requisition): try: # matplotlib < 0.98 requisition.width = self.figure.bbox.width() requisition.height = self.figure.bbox.height() except TypeError: # matplotlib >= 0.98 requisition.width = self.figure.bbox.width requisition.height = self.figure.bbox.height def recompute_figure_size(self): width = (self.sidebar_width / self.figure.dpi) height = width / DEFAULT_ASPECT_RATIO self.figure.set_figwidth(width) self.figure.set_figheight(height) self.queue_resize() def sync_dpi(self, dpi): self.figure.set_dpi(dpi) if self.sidebar_width >= 0: self.recompute_figure_size() def set_sidebar_width(self, width): if self.sidebar_width == width: return self.sidebar_width = width if self.sidebar_width >= 0: self.recompute_figure_size() def sync_style(self, style): self.cached_contents = None matplotlib.rcParams[ 'font.size'] = self.parent.style.font_desc.get_size() / pango.SCALE def __save(self, filename): # The save/restore here was added to matplotlib's after 0.90. We duplicate # it for compatibility with older versions. (The code would need modification # for 0.98 and newer, which is the reason for the particular version in the # check) version = [int(x) for x in matplotlib.__version__.split('.')] need_save = version[:2] < [0, 98] if need_save: orig_dpi = self.figure.dpi.get() orig_facecolor = self.figure.get_facecolor() orig_edgecolor = self.figure.get_edgecolor() try: self.canvas.print_figure(filename) finally: if need_save: self.figure.dpi.set(orig_dpi) self.figure.set_facecolor(orig_facecolor) self.figure.set_edgecolor(orig_edgecolor) self.figure.set_canvas(self.canvas)
def saveBackground(self, event): self.subplots_adjust(left=0.1, right=0.90, bottom=0.15, top=0.92, wspace=0.4, hspace=0.05) self.setDateFormat() self.parent.updateStyle() Figure.draw(self, event) self.parent.background = self.canvas.copy_from_bbox(self.parent.ax.bbox)