class XYDialog: def __init__(self, title, parent, filename, tmpn, type): # create matplotlib figure self.figure = Figure() self.canvas = FigureCanvas(self.figure) self.mp = ManipulateXYData(filename, type, self.figure, self, tmpn=tmpn) # create GTK dialog self.dialog = gtk.Dialog(title=title, parent=parent, flags=gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT) self.dialog.set_default_size(500, 400) self.vBox = self.dialog.vbox # setup matplotlib events self.canvas.mpl_connect('button_press_event', self.mp.on_click) self.canvas.mpl_connect('button_release_event', self.mp.on_release) # create buttons self.buttonBox = gtk.HBox(homogeneous=True, spacing=5) self.saveButton = gtk.Button(label="Save and Use", stock=gtk.STOCK_SAVE) self.useButton = gtk.Button(label="Use") self.revertButton = gtk.Button(label="Revert") self.cancelButton = gtk.Button(label="Cancel") # pack buttons self.buttonBox.pack_start(self.saveButton, expand=False) self.buttonBox.pack_start(self.useButton, expand=False) self.buttonBox.pack_start(self.revertButton, expand=False) self.buttonBox.pack_end(self.cancelButton, expand=False) # connect buttons self.use = False self.save = False self.saveButton.connect("clicked", self.saveHandler) self.useButton.connect("clicked", self.useHandler) self.revertButton.connect("clicked", self.revertHandler) self.cancelButton.connect("clicked", self.cancelHandler) # pack and show dialog self.vBox.pack_start(self.canvas, expand=True) self.vBox.pack_start(gtk.HSeparator(), expand=False) self.vBox.pack_end(self.buttonBox, expand=False) self.dialog.show_all() def redraw(self): self.canvas.draw() def saveHandler(self, widget): self.mp.save_to_file() self.save = True self.exit() def useHandler(self, widget): self.mp.save_to_file() self.use = True self.save = False self.exit() def revertHandler(self, widget): self.mp.reset_data() def cancelHandler(self, widget): self.save = False self.use = False self.exit() def exit(self): self.dialog.hide() #self.dialog.response(0)
class ComponentChooser(gtk.Window): """Used for selecting components to use for remixing""" components = None # Contains the components to choose from data = None # Contains the original data choose_mask = [] def __init__(self, _components = None, _data=None): self.components = _components self.data = _data gtk.Window.__init__(self,gtk.WINDOW_TOPLEVEL) self.set_default_size(700,500) self.set_title("Choose components to use...") self.connect("delete_event", self.delete_event) self.connect("destroy", self.delete_event) self.vbox = gtk.VBox() self.add(self.vbox) self.f = Figure(figsize=(5,4), dpi=100, subplotpars=SubplotParams(left=0.06, top=0.95, right=0.97, bottom=0.1)) self.setupSubplots() self.plotAll() self.canvas = FigureCanvas(self.f) self.canvas.mpl_connect('button_press_event', self.cb_canvas) self.vbox.pack_start(self.canvas) self.toolbar = NavigationToolbar( self.canvas, self.window ) self.vbox.pack_start(self.toolbar, False, False) self.show_all() def delete_event(self, widget, event, data=None): self.hide() return True def cb_canvas(self, event): """Called when the figure is clicked.""" #print event.button if event.button == 3: for i,a in enumerate(self.axs): if event.inaxes == a: #print "Subplot %i geclickt" % i self.choose_mask[i] = bool(True-self.choose_mask[i]) #print self.choose_mask[i] #a.grid() a.cla() #TODO: plotte... a.plot(self.components[:,i]) # if not self.choose_mask[i]: a.text(numpy.array(a.get_xlim()).mean(),numpy.array(a.get_ylim()).mean(),"X",horizontalalignment='center',verticalalignment='center',fontsize=20,color="red") self.canvas.draw() def setupSubplots(self): self.f.clear() try: ncols = 4 nrows = self.components.shape[1]/ncols +1 self.axs = [] self.choose_mask = [] for i in range(self.components.shape[1]): self.axs.append(self.f.add_subplot(nrows,ncols,i+1)) self.choose_mask.append(True) except Exception, e: print "Error while setting up subplots", e
class XYDialog: def __init__(self, title, parent, syn2d, numX, numY): # create buttons self.loadButton = gtk.Button(label="Load", stock=gtk.STOCK_OPEN) self.saveButton = gtk.Button(label="Save and Use", stock=gtk.STOCK_SAVE) self.useButton = gtk.Button(label="Use") self.revertButton = gtk.Button(label="Revert") self.clearButton = gtk.Button(label="Clear") self.cancelButton = gtk.Button(label="Cancel") # create matplotlib figure self.figure = Figure() self.canvas = FigureCanvas(self.figure) self.mp = DataPointChooser(self.figure, self, numX, numY) self.syn2d = syn2d self.parent = parent self.sourcesFile, self.receiversFile = self.syn2d.getDataFiles() print "Loading initial data from: " + self.sourcesFile + " , " + self.receiversFile sources = self.loadXYFile(self.sourcesFile) receivers = self.loadXYFile(self.receiversFile, True) # create GTK dialog self.dialog = gtk.Dialog(title=title, parent=parent, flags=gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT) self.dialog.set_default_size(500, 400) self.vBox = self.dialog.vbox # setup matplotlib events self.canvas.mpl_connect('button_press_event', self.mp.on_click) # pack buttons self.buttonBox = gtk.HBox(homogeneous=True, spacing=5) self.buttonBox.pack_start(self.loadButton, expand=False) self.buttonBox.pack_start(self.saveButton, expand=False) self.buttonBox.pack_start(self.useButton, expand=False) self.buttonBox.pack_start(self.revertButton, expand=False) self.buttonBox.pack_start(self.clearButton, expand=False) self.buttonBox.pack_end(self.cancelButton, expand=False) # connect buttons self.use = False self.loadButton.connect("clicked", self.loadHandler) self.saveButton.connect("clicked", self.saveHandler) self.useButton.connect("clicked", self.useHandler) self.revertButton.connect("clicked", self.revertHandler) self.clearButton.connect("clicked", self.clearHandler) self.cancelButton.connect("clicked", self.cancelHandler) self.label = gtk.Label( "Mouse Buttons: L-Add Station, M-Delete Point, R-Add Source") # pack and show dialog self.vBox.pack_start(self.canvas, expand=True) self.vBox.pack_start(gtk.HSeparator(), expand=False) self.vBox.pack_start(self.label, expand=False) self.vBox.pack_end(self.buttonBox, expand=False) self.mp.setOriginalData(sources, receivers) self.mp.reset_data() self.dialog.show_all() def redraw(self): self.canvas.draw() def loadHandler(self, widget): chooser = gtk.FileChooserDialog(title="Select DIRECTORY Containing 'sources.txt' and 'receivers.txt' Files", \ parent=self.parent, \ action=gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, \ buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, \ gtk.STOCK_OPEN, gtk.RESPONSE_OK)) response = chooser.run() if (response == gtk.RESPONSE_OK): dir = chooser.get_filename() sourceName = dir + os.sep + "sources.txt" if (os.path.exists(sourceName)): sources = self.loadXYFile(sourceName) else: sources = [] receiverName = dir + os.sep + "receivers.txt" if (os.path.exists(receiverName)): receivers = self.loadXYFile(receiverName) else: receivers = [] self.mp.setOriginalData(sources, receivers) self.mp.reset_data() chooser.destroy() def loadXYFile(self, file, skipDuplicates=False): if not os.path.exists(file): return [] x, y = self.syn2d.loadXYFile(file) data = [] for i in range(0, len(x)): if skipDuplicates: skip = False for point in data: if point[0] == x[i] and point[1] == y[i]: skip = True break if skip: continue data.append((x[i], y[i])) return data def writeXYFile(self, file, data): fp = open(file, "w") for point in data: fp.write(str(point[0]) + " " + str(point[1]) + "\n") fp.close() def saveHandler(self, widget): chooser = gtk.FileChooserDialog(title="Select DIRECTORY to save 'sources.txt' and 'receivers.txt' Files", \ parent=self.parent, \ action=gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, \ buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, \ gtk.STOCK_OPEN, gtk.RESPONSE_OK)) response = chooser.run() if (response == gtk.RESPONSE_OK): dir = chooser.get_filename() self.writeDataFiles(dir) chooser.destroy() def writeDataFiles(self, dir): if not dir.endswith(os.sep): dir += os.sep sourceName = dir + "sources.txt" self.writeXYFile(sourceName, self.mp.getSources()) receiverName = dir + "receivers.txt" self.writeXYFile(receiverName, self.mp.getReceivers()) return (sourceName, receiverName) def useHandler(self, widget): self.sourcesFile, self.receiversFile = self.writeDataFiles( self.syn2d.getWorkingDir()) self.use = True self.exit() def clearHandler(self, widget): self.mp.setOriginalData([], []) self.mp.reset_data() def getSourcesFile(self): return self.sourcesFile def getReceiversFile(self): return self.receiversFile def wasUseSelected(self): print "USE? " + str(self.use) return self.use def revertHandler(self, widget): self.mp.reset_data() def cancelHandler(self, widget): self.use = False self.exit() def updateButtons(self, sources, receivers): self.useButton.set_sensitive(len(sources) > 0 and len(receivers) > 0) def exit(self): self.dialog.hide()
class JPlot: """Misspecification plot""" def __init__(self, app): #setup matplotlib stuff on first notebook page (empty graph) self.app = app # Plot defaults: self.imp_col = '#dd2244' self.nim_col = '#5533dd' # Create figure self.figure = Figure(figsize=(6,4), dpi=72) self.axis = self.figure.add_subplot(111) self.axis.set_xlabel('Modification index') self.axis.set_ylabel('Power') self.axis.set_title('Misspecifications') try: # omit missing observations parameters = [par for par in self.app.get_parameters() if \ par.mi <99.0 and par.power < 1.0 and par.epc < 99.0] self.mis = [par.mi for par in parameters] self.names = [par.name for par in parameters] self.powers = [par.power for par in parameters] self.ids = ["%s in group %s" % (par.name, par.group) for par in parameters] self.axis.scatter( self.mis, self.powers, c = [par.epc > self.app.get_field_value('delta') \ and self.imp_col or self.nim_col for par in parameters], linewidth=0, picker=30.0, vmin=self.imp_col, vmax = self.nim_col, ) self.axis.autoscale_view(True) #tight self.axis.axvline(self.app.get_critical(), color='#444444', linestyle='dashed') self.axis.axhline( y=float(self.app.get_field_value('power')), color='#444444', linestyle='dashed') except AttributeError: pass self.draw() def pick_handler(self, event): '''What happens if the user clicks a point in the plot''' index = event.ind[0] label = self.ids[index] sys.stderr.write('ind is %s'% index) sys.stderr.write('mousover %s\n' % label) x, y = self.mis[index], self.powers[index] self.axis.text(x, y, label) self.draw() def draw(self): 'Draw or re-draw the plot, possibly showing some labels' try: self.graphview.remove(self.canvas) except: pass self.canvas = FigureCanvasGTK(self.figure) self.canvas.mpl_connect('pick_event', self.pick_handler) self.canvas.show() self.graphview = self.app.tree.get_widget("vbox_plot") self.graphview.pack_start(self.canvas, True, True) def reload(self): 'Completely redo the whole plot.' self.graphview.remove(self.canvas) self.__init__(self.app)