class ModeViewer2D(Toplevel): def __init__(self, master, mode_projector): Toplevel.__init__(self, master) self.title("2D Mode Projection") self.mode_projector = mode_projector frame = Frame(self) frame.pack(side=TOP, fill=BOTH, expand=YES) self.xnum = IntEntry(frame, "X mode number: ", 6, 6, mode_projector.numberOfModes() - 1) self.xnum.pack(side=LEFT) self.xnum.bind('<Return>', self.draw) self.ynum = IntEntry(frame, " Y mode number: ", 7, 6, mode_projector.numberOfModes() - 1) self.ynum.pack(side=LEFT) self.ynum.bind('<Return>', self.draw) self.plot = PlotCanvas(self, 400, 400) self.plot.pack(side=TOP, fill=BOTH, expand=YES) self.draw() def draw(self, event=None): xnum = self.xnum.get() ynum = self.ynum.get() self.mode_projector.calculateProjections([xnum, ynum]) data = self.mode_projector[ynum] data[:, 0] = self.mode_projector[xnum][:, 1] self.plot.clear() self.plot.draw(PolyLine(data, color='red'))
class ModeViewer2D(Toplevel): def __init__(self, master, mode_projector): Toplevel.__init__(self, master) self.title("2D Mode Projection") self.mode_projector = mode_projector frame = Frame(self) frame.pack(side=TOP, fill=BOTH, expand=YES) self.xnum = IntEntry(frame, "X mode number: ", 6, 6, mode_projector.numberOfModes()-1) self.xnum.pack(side=LEFT) self.xnum.bind('<Return>', self.draw) self.ynum = IntEntry(frame, " Y mode number: ", 7, 6, mode_projector.numberOfModes()-1) self.ynum.pack(side=LEFT) self.ynum.bind('<Return>', self.draw) self.plot = PlotCanvas(self, 400, 400) self.plot.pack(side=TOP, fill=BOTH, expand=YES) self.draw() def draw(self, event=None): xnum = self.xnum.get() ynum = self.ynum.get() self.mode_projector.calculateProjections([xnum, ynum]) data = self.mode_projector[ynum] data[:, 0] = self.mode_projector[xnum][:, 1] self.plot.clear() self.plot.draw(PolyLine(data, color = 'red'))
class TkPlotCanvasDemo1: def __init__(self, parent): self.master = parent self.ncurves = 3 # number of curves self.npoints = 20 # number of points on each curve # here we store data in plain NumPy arrays self.vector_x = zeros(self.npoints) # use a list of y vectors(0:self.ncurves-1) self.vector_y = [zeros(self.npoints) \ for y in range(self.ncurves)] self.fill_vectors() # fill the vectors with data for testing # make graph widget: self.g = PlotCanvas(self.master, 500, 300, zoom=True, relief='sunken', border=2) self.g.pack(expand=True, fill='both') # define a list of colors for the various curves: colors = ['red', 'yellow', 'blue', 'green', 'black', 'grey'] # plot each curve: # the x coordinates are in self.vector_x # the y coordinates are in self.vector_y[i] self.curves = [] for i in range(self.ncurves): xy_pairs = array([self.vector_x, self.vector_y[i]]).transpose() c = PolyLine(xy_pairs, width=1 + i, color=colors[i]) self.curves.append(c) object = PlotGraphics(self.curves) self.g.draw(object, xaxis='automatic', yaxis='automatic') self.buttons = Pmw.ButtonBox(self.master, labelpos='n', label_text='Options:') self.buttons.pack(fill='both', expand=True, padx=10, pady=10) # add buttons: self.buttons.add('Move points', command=self.animate) self.buttons.add('Postscript', command=self.postscript) self.buttons.add('Symbols', command=self.symbols) self.buttons.add('Quit', command=self.master.quit) self.buttons.alignbuttons() # nice loook... def symbols(self): """Turn on symbols (triangles) at all points.""" curves_wsymbol = [PolyMarker(curve.points, color='blue', marker='triangle') \ for curve in self.curves] self.g.draw(PlotGraphics(curves_wsymbol)) # plot collection def fill_vectors(self): """Fill NumPy vectors with (random) values.""" # use random numbers for generating plot data: random.seed(9) # fix the seed for testing for index in range(self.npoints): self.vector_x[index] = index # x coordinates for y in range(self.ncurves): self.vector_y[y][index] = random.uniform(0, 8) def animate(self, delay=100): """Adjust curves randomly, in an animated fashion.""" self.g.clear() # erase all plot data for curve in self.curves: p = curve.points # [[x1,y1],[x,2,y2],...] (NumPy) for index in range(p.shape[0]): p[index][1] = random.uniform(0, 8) self.g.draw(curve, xaxis='automatic', yaxis=(0, 8)) # plot PolyLine self.master.after(delay) self.master.update() def postscript(self): """Generate a hardcopy of the plot in PostScript.""" self.g.canvas.postscript(file='tmp2.ps')
class TkPlotCanvasDemo1: def __init__(self, parent): self.master = parent self.ncurves = 3 # number of curves self.npoints = 20 # number of points on each curve # here we store data in plain NumPy arrays self.vector_x = zeros(self.npoints) # use a list of y vectors(0:self.ncurves-1) self.vector_y = [zeros(self.npoints) \ for y in range(self.ncurves)] self.fill_vectors() # fill the vectors with data for testing # make graph widget: self.g = PlotCanvas(self.master, 500, 300, zoom=True, relief='sunken', border=2) self.g.pack(expand=True, fill='both') # define a list of colors for the various curves: colors = ['red','yellow','blue','green','black','grey'] # plot each curve: # the x coordinates are in self.vector_x # the y coordinates are in self.vector_y[i] self.curves = [] for i in range(self.ncurves): xy_pairs = array([self.vector_x,self.vector_y[i]]).transpose() c = PolyLine(xy_pairs, width=1+i, color=colors[i]) self.curves.append(c) object = PlotGraphics(self.curves) self.g.draw(object, xaxis='automatic', yaxis='automatic') self.buttons = Pmw.ButtonBox(self.master, labelpos='n', label_text='Options:') self.buttons.pack(fill='both', expand=True, padx=10, pady=10) # add buttons: self.buttons.add('Move points',command=self.animate) self.buttons.add('Postscript', command=self.postscript) self.buttons.add('Symbols', command=self.symbols) self.buttons.add('Quit', command=self.master.quit) self.buttons.alignbuttons() # nice loook... def symbols(self): """Turn on symbols (triangles) at all points.""" curves_wsymbol = [PolyMarker(curve.points, color='blue', marker='triangle') \ for curve in self.curves] self.g.draw(PlotGraphics(curves_wsymbol)) # plot collection def fill_vectors(self): """Fill NumPy vectors with (random) values.""" # use random numbers for generating plot data: random.seed(9) # fix the seed for testing for index in range(self.npoints): self.vector_x[index] = index # x coordinates for y in range(self.ncurves): self.vector_y[y][index] = random.uniform(0,8) def animate(self,delay=100): """Adjust curves randomly, in an animated fashion.""" self.g.clear() # erase all plot data for curve in self.curves: p = curve.points # [[x1,y1],[x,2,y2],...] (NumPy) for index in range(p.shape[0]): p[index][1] = random.uniform(0,8) self.g.draw(curve,xaxis='automatic',yaxis=(0,8)) # plot PolyLine self.master.after(delay) self.master.update() def postscript(self): """Generate a hardcopy of the plot in PostScript.""" self.g.canvas.postscript(file='tmp2.ps')
class ScatteringFunctionPlot(Frame): def __init__(self, master, filename): Frame.__init__(self, master) file = NetCDFFile(filename) self.q = file.variables['q'][1:] self.t = file.variables['time'][:] self.fn = file.variables['sf'][1:, :] Label(self, text='S(t) for various q').pack(side=TOP, fill=X) self.plot1 = PlotCanvas(self, 600, 250, zoom=1) self.plot1.pack(side=TOP, fill=BOTH, expand=YES) Label(self, text='S(q) for various t').pack(side=TOP, fill=X) self.plot2 = PlotCanvas(self, 600, 250, zoom=1) self.plot2.pack(side=TOP, fill=BOTH, expand=YES) frame = Frame(self) frame.pack(side=TOP, fill=X) self.first_q = IntEntry(frame, "q range: from ", 0, 0, len(self.q)) self.first_q.grid(row=0, column=0) self.first_q.bind('<Return>', self.draw) self.last_q = IntEntry(frame, " to ", len(self.q), 0, len(self.q)) self.last_q.grid(row=0, column=1) self.skip_q = IntEntry(frame, " skip ", (len(self.q) + 10) / 10, 1, len(self.q)) self.skip_q.grid(row=0, column=2) self.first_t = IntEntry(frame, "t range: from ", 0, 0, len(self.t)) self.first_t.grid(row=1, column=0) self.last_t = IntEntry(frame, " to ", len(self.t), 0, len(self.t)) self.last_t.grid(row=1, column=1) self.skip_t = IntEntry(frame, " skip ", (len(self.t) + 10) / 10, 1, len(self.t)) self.skip_t.grid(row=1, column=2) self.first_q.bind('<Return>', self.draw) self.last_q.bind('<Return>', self.draw) self.skip_q.bind('<Return>', self.draw) self.first_t.bind('<Return>', self.draw) self.last_t.bind('<Return>', self.draw) self.skip_t.bind('<Return>', self.draw) self.draw() def draw(self, event=None): try: first_q = self.first_q.get() last_q = self.last_q.get() skip_q = self.skip_q.get() first_t = self.first_t.get() last_t = self.last_t.get() skip_t = self.skip_t.get() except ValueError: return graphics1, graphics2 = self.plot_objects(first_q, last_q, skip_q, first_t, last_t, skip_t) self.plot1.clear() self.plot1.draw(PlotGraphics(graphics1), 'automatic', 'automatic') self.plot2.clear() self.plot2.draw(PlotGraphics(graphics2), 'automatic', 'automatic') def plot_objects(self, first_q, last_q, skip_q, first_t, last_t, skip_t): plot_objects1 = [] markers1 = [] color_index = 0 dt = (last_t - first_t + 150) / 150 for i in range(first_q, last_q, skip_q): data = self.fn[i, first_t:last_t:dt] data_t = self.t[first_t:last_t:dt] points = N.transpose(N.array([data_t, data])) plot_objects1.append( PolyLine(points, color=self.colors[color_index])) markers1.append(self.q[i], color_index) color_index = (color_index + 1) % len(self.colors) plot_objects2 = [] markers2 = [] color_index = 0 dq = (last_q - first_q + 150) / 150 for i in range(first_t, last_t, skip_t): data = self.fn[first_q:last_q:dq, i] data_q = self.q[first_q:last_q:dq] points = N.transpose(N.array([data_q, data])) plot_objects2.append( PolyLine(points, color=self.colors[color_index])) markers2.append(self.t[i], color_index) color_index = (color_index + 1) % len(self.colors) for q, color_index in markers1: plot_objects2.append( VerticalLine(q, color=self.colors[color_index], stipple='gray50')) for t, color_index in markers2: plot_objects1.append( VerticalLine(t, color=self.colors[color_index], stipple='gray50')) return plot_objects1, plot_objects2 colors = [ 'red', 'green', 'blue', 'orange', 'brown', 'yellow', 'violet', 'pink', 'cyan', 'grey' ]