⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wxplotcanvas.py

📁 Wxpython Implemented on Windows CE, Source code
💻 PY
📖 第 1 页 / 共 2 页
字号:
        text_height = [0., 0.]
        if xaxis is not None:
            p1[0] = xaxis[0]
            p2[0] = xaxis[1]
            xticks = self._ticks(xaxis[0], xaxis[1])
            bb = dc.GetTextExtent(xticks[0][1])
            text_height[1] = bb[1]
            text_width[0] = 0.5*bb[0]
            bb = dc.GetTextExtent(xticks[-1][1])
            text_width[1] = 0.5*bb[0]
        else:
            xticks = None
        if yaxis is not None:
            p1[1] = yaxis[0]
            p2[1] = yaxis[1]
            yticks = self._ticks(yaxis[0], yaxis[1])
            for y in yticks:
                bb = dc.GetTextExtent(y[1])
                text_width[0] = max(text_width[0],bb[0])
            h = 0.5*bb[1]
            text_height[0] = h
            text_height[1] = max(text_height[1], h)
        else:
            yticks = None
        text1 = Numeric.array([text_width[0], -text_height[1]])
        text2 = Numeric.array([text_width[1], -text_height[0]])
        scale = (self.plotbox_size-text1-text2) / (p2-p1)
        shift = -p1*scale + self.plotbox_origin + text1
        self._drawAxes(dc, xaxis, yaxis, p1, p2,
                       scale, shift, xticks, yticks)
        graphics.scaleAndShift(scale, shift)
        graphics.draw(dc)
        dc.EndDrawing()

    def _axisInterval(self, spec, lower, upper):
        if spec is None:
            return None
        if spec == 'minimal':
            if lower == upper:
                return lower-0.5, upper+0.5
            else:
                return lower, upper
        if spec == 'automatic':
            range = upper-lower
            if range == 0.:
                return lower-0.5, upper+0.5
            log = Numeric.log10(range)
            power = Numeric.floor(log)
            fraction = log-power
            if fraction <= 0.05:
                power = power-1
            grid = 10.**power
            lower = lower - lower % grid
            mod = upper % grid
            if mod != 0:
                upper = upper - mod + grid
            return lower, upper
        if type(spec) == type(()):
            lower, upper = spec
            if lower <= upper:
                return lower, upper
            else:
                return upper, lower
        raise ValueError, str(spec) + ': illegal axis specification'

    def _drawAxes(self, dc, xaxis, yaxis,
                  bb1, bb2, scale, shift, xticks, yticks):
        dc.SetPen(wx.Pen(wx.NamedColour('BLACK'),1))
        if xaxis is not None:
            lower, upper = xaxis
            text = 1
            for y, d in [(bb1[1], -3), (bb2[1], 3)]:
                p1 = scale*Numeric.array([lower, y])+shift
                p2 = scale*Numeric.array([upper, y])+shift
                dc.DrawLine(p1[0],p1[1], p2[0],p2[1])
                for x, label in xticks:
                    p = scale*Numeric.array([x, y])+shift
                    dc.DrawLine(p[0],p[1], p[0],p[1]+d)
                    if text:
                        dc.DrawText(label, p[0],p[1])
                text = 0

        if yaxis is not None:
            lower, upper = yaxis
            text = 1
            h = dc.GetCharHeight()
            for x, d in [(bb1[0], -3), (bb2[0], 3)]:
                p1 = scale*Numeric.array([x, lower])+shift
                p2 = scale*Numeric.array([x, upper])+shift
                dc.DrawLine(p1[0],p1[1], p2[0],p2[1])
                for y, label in yticks:
                    p = scale*Numeric.array([x, y])+shift
                    dc.DrawLine(p[0],p[1], p[0]-d,p[1])
                    if text:
                        dc.DrawText(label, 
                                    p[0]-dc.GetTextExtent(label)[0], p[1]-0.5*h)
                text = 0

    def _ticks(self, lower, upper):
        ideal = (upper-lower)/7.
        log = Numeric.log10(ideal)
        power = Numeric.floor(log)
        fraction = log-power
        factor = 1.
        error = fraction
        for f, lf in self._multiples:
            e = Numeric.fabs(fraction-lf)
            if e < error:
                error = e
                factor = f
        grid = factor * 10.**power
        if power > 3 or power < -3:
            format = '%+7.0e'
        elif power >= 0:
            digits = max(1, int(power))
            format = '%' + `digits`+'.0f'
        else:
            digits = -int(power)
            format = '%'+`digits+2`+'.'+`digits`+'f'
        ticks = []
        t = -grid*Numeric.floor(-lower/grid)
        while t <= upper:
            ticks.append( (t, format % (t,)) )
            t = t + grid
        return ticks

    _multiples = [(2., Numeric.log10(2.)), (5., Numeric.log10(5.))]

    def redraw(self,dc=None):
        if self.last_draw is not None:
            apply(self.draw, self.last_draw + (dc,))

    def clear(self):
        self.canvas.delete('all')

#---------------------------------------------------------------------------
# if running standalone...
#
#     ...a sample implementation using the above
#


if __name__ == '__main__':
    def _InitObjects():
        # 100 points sin function, plotted as green circles
        data1 = 2.*Numeric.pi*Numeric.arange(200)/200.
        data1.shape = (100, 2)
        data1[:,1] = Numeric.sin(data1[:,0])
        markers1 = PolyMarker(data1, color='green', marker='circle',size=1)

        # 50 points cos function, plotted as red line
        data1 = 2.*Numeric.pi*Numeric.arange(100)/100.
        data1.shape = (50,2)
        data1[:,1] = Numeric.cos(data1[:,0])
        lines = PolyLine(data1, color='red')

        # A few more points...
        pi = Numeric.pi
        markers2 = PolyMarker([(0., 0.), (pi/4., 1.), (pi/2, 0.),
                              (3.*pi/4., -1)], color='blue',
                              fillcolor='green', marker='cross')

        return PlotGraphics([markers1, lines, markers2])


    class AppFrame(wx.Frame):
        def __init__(self, parent, id, title):
            wx.Frame.__init__(self, parent, id, title,
                                wx.DefaultPosition, (400, 400))

            # Now Create the menu bar and items
            self.mainmenu = wx.MenuBar()

            menu = wx.Menu()
            menu.Append(200, '&Print...', 'Print the current plot')
            self.Bind(wx.EVT_MENU, self.OnFilePrint, id=200)
            menu.Append(209, 'E&xit', 'Enough of this already!')
            self.Bind(wx.EVT_MENU, self.OnFileExit, id=209)
            self.mainmenu.Append(menu, '&File')

            menu = wx.Menu()
            menu.Append(210, '&Draw', 'Draw plots')
            self.Bind(wx.EVT_MENU,self.OnPlotDraw, id=210)
            menu.Append(211, '&Redraw', 'Redraw plots')
            self.Bind(wx.EVT_MENU,self.OnPlotRedraw, id=211)
            menu.Append(212, '&Clear', 'Clear canvas')
            self.Bind(wx.EVT_MENU,self.OnPlotClear, id=212)
            self.mainmenu.Append(menu, '&Plot')

            menu = wx.Menu()
            menu.Append(220, '&About', 'About this thing...')
            self.Bind(wx.EVT_MENU, self.OnHelpAbout, id=220)
            self.mainmenu.Append(menu, '&Help')

            self.SetMenuBar(self.mainmenu)

            # A status bar to tell people what's happening
            self.CreateStatusBar(1)

            self.client = PlotCanvas(self)

        def OnFilePrint(self, event):
            d = wx.MessageDialog(self,
"""As of this writing, printing support in wxPython is shaky at best.
Are you sure you want to do this?""", "Danger!", wx.YES_NO)
            if d.ShowModal() == wx.ID_YES:
                psdc = wx.PostScriptDC("out.ps", True, self)
                self.client.redraw(psdc)

        def OnFileExit(self, event):
            self.Close()

        def OnPlotDraw(self, event):
            self.client.draw(_InitObjects(),'automatic','automatic');

        def OnPlotRedraw(self,event):
            self.client.redraw()

        def OnPlotClear(self,event):
            self.client.last_draw = None
            dc = wx.ClientDC(self.client)
            dc.Clear()

        def OnHelpAbout(self, event):
            about = wx.MessageDialog(self, __doc__, "About...", wx.OK)
            about.ShowModal()



    class MyApp(wx.App):
        def OnInit(self):
            frame = AppFrame(None, -1, "wxPlotCanvas")
            frame.Show(True)
            self.SetTopWindow(frame)
            return True


    app = MyApp(0)
    app.MainLoop()




#----------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -