示例#1
0
    def __init__(self, box, searchform):
        self.searchform = searchform
        vbox = gtk.VBox(False, 0)
        vbox.set_border_width(6)

        def scale_format_value(scale, value):
            return '%f' % log_scale(value)

        self.adj = gtk.Adjustment(0.50, 0, 1, 0.01, 0.1, 0)
        self.slider = gtk.HScale(self.adj)
        self.slider.connect('format-value', scale_format_value)
        self.slider.set_digits(2)

        self.adj2 = gtk.Adjustment(0.50, 0, 1, 0.01, 0.1, 0)
        self.slider2 = gtk.HScale(self.adj2)
        self.slider2.connect('format-value', scale_format_value)
        self.slider2.set_digits(2)

        self.adj.connect("value_changed", self.cb_threshold_changed)
        self.adj2.connect("value_changed", self.cb_threshold_changed)

        self.igraph_drawing_area = IGraphDrawingArea()
        #self.cb_threshold_changed(self.adj)

        hbox_buttons = gtk.HBox(True, 0)
        self.filter_checkbutton = gtk.CheckButton("Filter manually")
        self.filter_checkbutton.connect("toggled",
                                        self.on_filter_checkbutton_changed)
        self.isolated_button = gtk.CheckButton("Show only not-isolated")
        self.isolated_button.connect("toggled", self.cb_threshold_changed)

        table = gtk.Table(3, 3, False)
        table.set_row_spacings(3)
        table.set_col_spacings(6)
        # child, left_attach, right_attach, top_attach, bottom_attach, xoptions=gtk.EXPAND|gtk.FILL, yoptions=gtk.EXPAND|gtk.FILL, xpadding=0, ypadding=0)
        table.attach(gtk.Label("Minumum edges weight:"), 0, 1, 0, 1, gtk.FILL)
        table.attach(self.slider, 0, 1, 1, 3, gtk.EXPAND | gtk.FILL)
        table.attach(gtk.Label("Minimum vertices size:"), 1, 2, 0, 1, gtk.FILL)
        table.attach(self.slider2, 1, 2, 1, 3, gtk.EXPAND | gtk.FILL)

        table.attach(gtk.Label('Vertices:'), 2, 3, 0, 1, gtk.FILL)
        table.attach(self.filter_checkbutton, 2, 3, 1, 2, gtk.FILL)
        table.attach(self.isolated_button, 2, 3, 2, 3, gtk.FILL)

        vbox.pack_start(self.igraph_drawing_area, True, True, 0)
        inner_vbox = gtk.VBox(False, 6)
        inner_vbox.set_border_width(3)
        inner_vbox.pack_start(table, False, True, 0)
        #inner_vbox.pack_start(hbox_buttons, False, False, 0)
        frame = gtk.Frame('Graph parameters')
        frame.add(inner_vbox)
        vbox.pack_start(frame, False, False, 0)

        box.add(vbox)
示例#2
0
    def __init__(self, box, searchform):
        self.searchform = searchform
        vbox = gtk.VBox(False, 0)
        vbox.set_border_width(6)

        def log_scale(x):
            return (exp(x)-1)/(exp(1)-1)

        def quad_scale(x):
            return x**4

        def scale_format_value(scale, value):
            #return '%5.3f' % log_scale(value)
            return '%7.5f' % quad_scale(value)
        
        self.adj = gtk.Adjustment(0.50, 0, 1, 0.01, 0.1, 0)
        self.slider = gtk.HScale(self.adj)
        #self.slider.connect('format-value', scale_format_value)
        self.slider.set_digits(4)

        self.adj2 = gtk.Adjustment(0.50, 0, 1, 0.01, 0.1, 0)
        self.slider2 = gtk.HScale(self.adj2)
        #self.slider2.connect('format-value', scale_format_value)
        self.slider2.set_digits(4)

        self.adj.connect("value_changed", self.cb_threshold_changed)
        self.adj2.connect("value_changed", self.cb_threshold_changed)
        
        self.igraph_drawing_area = IGraphDrawingArea()
        #self.cb_threshold_changed(self.adj)

        hbox_buttons = gtk.HBox(True, 0)
        self.filter_checkbutton = gtk.CheckButton("Filter manually")
        self.filter_checkbutton.connect("toggled", self.on_filter_checkbutton_changed)
        self.isolated_button = gtk.CheckButton("Show only not-isolated")
        self.isolated_button.connect("toggled", self.cb_threshold_changed)
        
        table = gtk.Table(3, 3, False)
        table.set_row_spacings(3)
        table.set_col_spacings(6)
        # child, left_attach, right_attach, top_attach, bottom_attach, xoptions=gtk.EXPAND|gtk.FILL, yoptions=gtk.EXPAND|gtk.FILL, xpadding=0, ypadding=0)
        table.attach(gtk.Label("Minumum edges weight:"), 0, 1, 0, 1, gtk.FILL)
        table.attach(self.slider, 0, 1, 1, 3, gtk.EXPAND|gtk.FILL)
        table.attach(gtk.Label("Minimum vertices size:"), 1, 2, 0, 1, gtk.FILL)
        table.attach(self.slider2, 1, 2, 1, 3, gtk.EXPAND|gtk.FILL)
        
        table.attach(gtk.Label('Vertices:'), 2, 3, 0, 1, gtk.FILL)
        table.attach(self.filter_checkbutton, 2, 3, 1, 2, gtk.FILL)
        table.attach(self.isolated_button, 2, 3, 2, 3, gtk.FILL)
        
        vbox.pack_start(self.igraph_drawing_area, True, True, 0)
        inner_vbox = gtk.VBox(False, 6)
        inner_vbox.set_border_width(3)
        inner_vbox.pack_start(table, False, True, 0)
        #inner_vbox.pack_start(hbox_buttons, False, False, 0)
        frame = gtk.Frame('Graph parameters')
        frame.add(inner_vbox)
        vbox.pack_start(frame, False, False, 0)
        
        box.add(vbox)
示例#3
0
class MMResultGraph():
    def __init__(self, box, searchform):
        self.searchform = searchform
        vbox = gtk.VBox(False, 0)
        vbox.set_border_width(6)

        def log_scale(x):
            return (exp(x)-1)/(exp(1)-1)

        def quad_scale(x):
            return x**4

        def scale_format_value(scale, value):
            #return '%5.3f' % log_scale(value)
            return '%7.5f' % quad_scale(value)
        
        self.adj = gtk.Adjustment(0.50, 0, 1, 0.01, 0.1, 0)
        self.slider = gtk.HScale(self.adj)
        #self.slider.connect('format-value', scale_format_value)
        self.slider.set_digits(4)

        self.adj2 = gtk.Adjustment(0.50, 0, 1, 0.01, 0.1, 0)
        self.slider2 = gtk.HScale(self.adj2)
        #self.slider2.connect('format-value', scale_format_value)
        self.slider2.set_digits(4)

        self.adj.connect("value_changed", self.cb_threshold_changed)
        self.adj2.connect("value_changed", self.cb_threshold_changed)
        
        self.igraph_drawing_area = IGraphDrawingArea()
        #self.cb_threshold_changed(self.adj)

        hbox_buttons = gtk.HBox(True, 0)
        self.filter_checkbutton = gtk.CheckButton("Filter manually")
        self.filter_checkbutton.connect("toggled", self.on_filter_checkbutton_changed)
        self.isolated_button = gtk.CheckButton("Show only not-isolated")
        self.isolated_button.connect("toggled", self.cb_threshold_changed)
        
        table = gtk.Table(3, 3, False)
        table.set_row_spacings(3)
        table.set_col_spacings(6)
        # child, left_attach, right_attach, top_attach, bottom_attach, xoptions=gtk.EXPAND|gtk.FILL, yoptions=gtk.EXPAND|gtk.FILL, xpadding=0, ypadding=0)
        table.attach(gtk.Label("Minumum edges weight:"), 0, 1, 0, 1, gtk.FILL)
        table.attach(self.slider, 0, 1, 1, 3, gtk.EXPAND|gtk.FILL)
        table.attach(gtk.Label("Minimum vertices size:"), 1, 2, 0, 1, gtk.FILL)
        table.attach(self.slider2, 1, 2, 1, 3, gtk.EXPAND|gtk.FILL)
        
        table.attach(gtk.Label('Vertices:'), 2, 3, 0, 1, gtk.FILL)
        table.attach(self.filter_checkbutton, 2, 3, 1, 2, gtk.FILL)
        table.attach(self.isolated_button, 2, 3, 2, 3, gtk.FILL)
        
        vbox.pack_start(self.igraph_drawing_area, True, True, 0)
        inner_vbox = gtk.VBox(False, 6)
        inner_vbox.set_border_width(3)
        inner_vbox.pack_start(table, False, True, 0)
        #inner_vbox.pack_start(hbox_buttons, False, False, 0)
        frame = gtk.Frame('Graph parameters')
        frame.add(inner_vbox)
        vbox.pack_start(frame, False, False, 0)
        
        box.add(vbox)

    def display(self, distances_list, terms):
        labels_id = {}
        labels = []
        edges = []
        weights = []
        sizes = []

        count = 0
        for i, row in enumerate(distances_list):
            w = row[2]
            keyword1 = row[0]
            keyword2 = row[1]
            if not labels_id.has_key(keyword1):
                labels_id[keyword1] = count
                labels.append(keyword1)
                sizes.append(float(row[3]))
                count += 1
            if not labels_id.has_key(keyword2):
                labels_id[keyword2] = count
                labels.append(keyword2)
                sizes.append(float(row[4]))
                count += 1
            edges.append((labels_id[keyword1], labels_id[keyword2]))
            weights.append(w)

        g = igraph.Graph(edges, directed=False)

        min_s = min(sizes)
        max_s = max(sizes)
        interval_s = max_s-min_s

        g.es['weight'] = weights     # for graphical purposes
        g.es['realweight'] = weights # used to show on the slider + export
        g.vs['label'] = labels
        g.vs['size'] = [10 + 15 * (i - min_s) / float(interval_s) for i in sizes] # normalize so that we don't get enormous balls
        g.vs['realsize'] = sizes     # used to show on the slider + export

        max_w = max(weights)
        self.adj.set_upper(max_w)
        self.adj.set_step_increment(max_w/100)
        self.adj.set_page_increment(max_w/10)

        self.adj2.set_lower(min_s)
        self.adj2.set_upper(max_s)
        self.adj2.set_step_increment(interval_s/100)
        self.adj2.set_page_increment(interval_s/10)

        g.vs['is_term'] = [False for l in labels] # FIXME: how do you set an attribute for all vertex?
        for term in terms:
            v = g.vs.select(label_eq=term)
            if len(v) == 1: 
                v['color'] = ['blue']
                v['is_term'] = [True]

        #fixed = [False for i in range(len(sizes)-1)]
        #fixed.append(True)
        #g.vs['fixed'] = fixed

        g.vs['fr_seed_coords'] = g.layout_circle()

        self.g = g

        self.adj.set_value(max_w/2)
        self.adj2.set_value(min_s+interval_s/2)
        #self.cb_threshold_changed(None) #not necessary since already called when setting adj and adj2 values

    def cb_threshold_changed(self, adj):
        # keep only edges where weight > threshold
        #g = self.g - self.g.es.select(weight_lt=log_scale(self.adj.value))
        g = self.g - self.g.es.select(realweight_lt=self.adj.value)
        
        # keep only vertex where size >= threshold
        #g = g.subgraph(g.vs.select(size_ge=log_scale(self.adj2.value)))
        g = g.subgraph(g.vs.select(realsize_ge=self.adj2.value))
        
        self.terms_list = []
        for v in g.vs:
            self.terms_list.append([v['label'], v['label']])

        if self.filter_checkbutton.get_active():
            # remove unchecked terms
            g = g.subgraph(g.vs.select(label_in=self.selected_terms))

        if self.isolated_button.get_active():
            # remove non isolated vertex (except terms)
            g = g - g.vs.select(_degree_eq=0, is_term_eq=False)
        
        self.changed_graph = g
        self.igraph_drawing_area.change_graph(g)

    def on_filter_checkbutton_changed(self, widget):
        if widget.get_active():
            # open list
            try:
                already_selected_terms = self.selected_terms
                d = MMSelectDialog('Terms', self.terms_list, already_selected_terms)
            except:
                d = MMSelectDialog('Terms', self.terms_list, None)
            
            if d.run() == gtk.RESPONSE_CANCEL:
                #logging.debug('User canceled terms selection dialog, unchecking filter checkbutton')
                widget.set_active(0)
            else:
                if d.return_id_list == []:
                    #logging.debug('User selected None, unchecking filter checkbutton')
                    widget.set_active(0)
                elif len(d.return_id_list) == len(self.terms_list):
                    #logging.debug("User selected all sources, selecting 'all'")
                    widget.set_active(0)
                else:
                    #logging.debug('User selected sources: %s' % ', '.join(d.return_id_list))
                    self.selected_terms = d.return_id_list
        else:
            # do nothing, checkbutton state is enough
            pass
        
        # refresh visualization
        self.cb_threshold_changed(None)

    def clear(self):
        self.igraph_drawing_area.change_graph(None)

    def export(self):
        dialog = gtk.FileChooserDialog(title='Export graph as..', action=gtk.FILE_CHOOSER_ACTION_SAVE,
                                        buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_SAVE,gtk.RESPONSE_OK))
        dialog.set_default_response(gtk.RESPONSE_OK)

        response = dialog.run()
        if response == gtk.RESPONSE_OK:
            f = dialog.get_filename()
            try:
                if f.endswith('pajek'):
                    MMWritePajek(self.changed_graph, f)
                elif f.endswith('condor'):
                    MMWriteCondor(self.changed_graph, f)
                else:
                    igraph.save(self.changed_graph, f)
                logging.info('%s saved' % f)
            except IOError, e:
                logging.error(e)
                message = 'Error: %s\n\nIf you specified and invalid format, use one of the following extensions:\n\n%s' % (e, '\n'.join(igraph.Graph._format_mapping.keys()))
                errordialog = gtk.MessageDialog(dialog, type=gtk.MESSAGE_ERROR,                
                                       buttons=gtk.BUTTONS_CLOSE, message_format=message)
                errordialog.run()
                errordialog.destroy()
        elif response == gtk.RESPONSE_CANCEL:
            pass
示例#4
0
class MMResultGraph():
    def __init__(self, box, searchform):
        self.searchform = searchform
        vbox = gtk.VBox(False, 0)
        vbox.set_border_width(6)

        def scale_format_value(scale, value):
            return '%f' % log_scale(value)

        self.adj = gtk.Adjustment(0.50, 0, 1, 0.01, 0.1, 0)
        self.slider = gtk.HScale(self.adj)
        self.slider.connect('format-value', scale_format_value)
        self.slider.set_digits(2)

        self.adj2 = gtk.Adjustment(0.50, 0, 1, 0.01, 0.1, 0)
        self.slider2 = gtk.HScale(self.adj2)
        self.slider2.connect('format-value', scale_format_value)
        self.slider2.set_digits(2)

        self.adj.connect("value_changed", self.cb_threshold_changed)
        self.adj2.connect("value_changed", self.cb_threshold_changed)

        self.igraph_drawing_area = IGraphDrawingArea()
        #self.cb_threshold_changed(self.adj)

        hbox_buttons = gtk.HBox(True, 0)
        self.filter_checkbutton = gtk.CheckButton("Filter manually")
        self.filter_checkbutton.connect("toggled",
                                        self.on_filter_checkbutton_changed)
        self.isolated_button = gtk.CheckButton("Show only not-isolated")
        self.isolated_button.connect("toggled", self.cb_threshold_changed)

        table = gtk.Table(3, 3, False)
        table.set_row_spacings(3)
        table.set_col_spacings(6)
        # child, left_attach, right_attach, top_attach, bottom_attach, xoptions=gtk.EXPAND|gtk.FILL, yoptions=gtk.EXPAND|gtk.FILL, xpadding=0, ypadding=0)
        table.attach(gtk.Label("Minumum edges weight:"), 0, 1, 0, 1, gtk.FILL)
        table.attach(self.slider, 0, 1, 1, 3, gtk.EXPAND | gtk.FILL)
        table.attach(gtk.Label("Minimum vertices size:"), 1, 2, 0, 1, gtk.FILL)
        table.attach(self.slider2, 1, 2, 1, 3, gtk.EXPAND | gtk.FILL)

        table.attach(gtk.Label('Vertices:'), 2, 3, 0, 1, gtk.FILL)
        table.attach(self.filter_checkbutton, 2, 3, 1, 2, gtk.FILL)
        table.attach(self.isolated_button, 2, 3, 2, 3, gtk.FILL)

        vbox.pack_start(self.igraph_drawing_area, True, True, 0)
        inner_vbox = gtk.VBox(False, 6)
        inner_vbox.set_border_width(3)
        inner_vbox.pack_start(table, False, True, 0)
        #inner_vbox.pack_start(hbox_buttons, False, False, 0)
        frame = gtk.Frame('Graph parameters')
        frame.add(inner_vbox)
        vbox.pack_start(frame, False, False, 0)

        box.add(vbox)

    def display(self, distances_list, terms):
        labels_id = {}
        labels = []
        edges = []
        weights = []
        sizes = []

        count = 0
        for i, row in enumerate(distances_list):
            w = row[2]
            keyword1 = row[0]
            keyword2 = row[1]
            if not labels_id.has_key(keyword1):
                labels_id[keyword1] = count
                labels.append(keyword1)
                sizes.append(float(row[3]))
                count += 1
            if not labels_id.has_key(keyword2):
                labels_id[keyword2] = count
                labels.append(keyword2)
                sizes.append(float(row[4]))
                count += 1
            edges.append((labels_id[keyword1], labels_id[keyword2]))
            weights.append(w)

        g = igraph.Graph(edges, directed=False)
        min_w = min(weights)
        max_w = max(weights)
        g.es['weight'] = [(i - min_w) / float(max_w - min_w) for i in weights]
        g.es['realweight'] = weights
        g.vs['label'] = labels

        min_size = min(sizes)
        max_size = max(sizes)
        g.vs['realsize'] = [(i - min_size) / float(max_size - min_size)
                            for i in sizes]
        g.vs['size'] = [10 + 15 * i for i in g.vs['realsize']]

        g.vs['is_term'] = [
            False for l in labels
        ]  # FIXME: how do you set an attribute for all vertex?
        for term in terms:
            v = g.vs.select(label_eq=term)
            if len(v) == 1:
                v['color'] = ['blue']
                v['is_term'] = [True]

        #fixed = [False for i in range(len(sizes)-1)]
        #fixed.append(True)
        #g.vs['fixed'] = fixed

        g.vs['fr_seed_coords'] = g.layout_circle()

        self.g = g

        self.cb_threshold_changed(None)

    def cb_threshold_changed(self, adj):
        # keep only edges where weight > threshold
        g = self.g - self.g.es.select(realweight_lt=log_scale(self.adj.value))

        # keep only vertex where size >= threshold
        g = g.subgraph(g.vs.select(realsize_ge=log_scale(self.adj2.value)))

        self.terms_list = []
        for v in g.vs:
            self.terms_list.append([v['label'], v['label']])

        if self.filter_checkbutton.get_active():
            # remove unchecked terms
            g = g.subgraph(g.vs.select(label_in=self.selected_terms))

        if self.isolated_button.get_active():
            # remove non isolated vertex (except terms)
            g = g - g.vs.select(_degree_eq=0, is_term_eq=False)

        self.changed_graph = g
        self.igraph_drawing_area.change_graph(g)

    def on_filter_checkbutton_changed(self, widget):
        if widget.get_active():
            # open list
            try:
                already_selected_terms = self.selected_terms
                d = MMSelectDialog('Terms', self.terms_list,
                                   already_selected_terms)
            except:
                d = MMSelectDialog('Terms', self.terms_list, None)

            if d.run() == gtk.RESPONSE_CANCEL:
                #logging.debug('User canceled terms selection dialog, unchecking filter checkbutton')
                widget.set_active(0)
            else:
                if d.return_id_list == []:
                    #logging.debug('User selected None, unchecking filter checkbutton')
                    widget.set_active(0)
                elif len(d.return_id_list) == len(self.terms_list):
                    #logging.debug("User selected all sources, selecting 'all'")
                    widget.set_active(0)
                else:
                    #logging.debug('User selected sources: %s' % ', '.join(d.return_id_list))
                    self.selected_terms = d.return_id_list
        else:
            # do nothing, checkbutton state is enough
            pass

        # refresh visualization
        self.cb_threshold_changed(None)

    def clear(self):
        self.igraph_drawing_area.change_graph(None)

    def export(self):
        dialog = gtk.FileChooserDialog(
            title='Export graph as..',
            action=gtk.FILE_CHOOSER_ACTION_SAVE,
            buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE,
                     gtk.RESPONSE_OK))
        dialog.set_default_response(gtk.RESPONSE_OK)

        response = dialog.run()
        if response == gtk.RESPONSE_OK:
            f = dialog.get_filename()
            try:
                if f.endswith('pajek'):
                    MMWritePajek(self.changed_graph, f)
                elif f.endswith('condor'):
                    MMWriteCondor(self.changed_graph, f)
                else:
                    igraph.save(self.changed_graph, f)
                logging.info('%s saved' % f)
            except IOError, e:
                logging.error(e)
                message = 'Error: %s\n\nIf you specified and invalid format, use one of the following extensions:\n\n%s' % (
                    e, '\n'.join(igraph.Graph._format_mapping.keys()))
                errordialog = gtk.MessageDialog(dialog,
                                                type=gtk.MESSAGE_ERROR,
                                                buttons=gtk.BUTTONS_CLOSE,
                                                message_format=message)
                errordialog.run()
                errordialog.destroy()
        elif response == gtk.RESPONSE_CANCEL:
            pass