Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
 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()
Ejemplo n.º 4
0
    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)
Ejemplo n.º 5
0
    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
Ejemplo n.º 6
0
    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
Ejemplo n.º 7
0
    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
Ejemplo n.º 8
0
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)
Ejemplo n.º 9
0
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)
Ejemplo n.º 10
0
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)