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'))
示例#2
0
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'))
示例#3
0
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')
示例#4
0
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')
示例#5
0
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'
    ]