wxPython 內崁 plt

      在〈wxPython 內崁 plt〉中尚無留言

matplotlib的pylab, 有個可以繪制圖形的Figure, 此Figure不但可以畫直線, 也可畫長條圖, 圓餅圖等統計圖, 只要把x, y軸的值丟進去, 圖就自動畫出來, 而且放大縮小, 全都自動完成. 不過, 就是長的那一副死模樣.

這麼好用的東西, 如果能崁在我們自已開發的視窗中, 那不就顯得超級專業了嗎.

運作方法

wxpython_plot

1. 首先, 需註明matplotlib.use(“WxAgg”), 將maplotlib置於後台使用
2. 產生一個Figure()物件. 在前幾章的說明中, 此物件是附著在plt裏面, 由plt.plot()下指令, 然後就會自動傳送到Figure()顯圖. 但我們現在要直接控制Figure()物件
3. Figure物件不能附著在wxPython中, 需將此物件附著在FigureCanvas物件, 而FigureCanvas則是wxPython的控制元件
4. 由Figure產生axes子區域物件, 然後就可以在axes裏繪制圖形了
5. axes繪製完成後, 需使用canvas的 draw, 進行Render才會真正的把圖形顯示出來

import wx, numpy as np
import pylab as plt
import matplotlib
from matplotlib.patches import Rectangle
# matplotlib使用WxAgg為後台, 將matplotlib嵌入wxPython中
matplotlib.use("WxAgg")
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
class MainFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, size = wx.Size( 800,640))
        self.figure=plt.Figure()
        self.figureCanvas=FigureCanvas(self,-1, self.figure)
        box=wx.BoxSizer(wx.VERTICAL)
        self.SetSizer(box)
        box.Add(self.figureCanvas,1,wx.EXPAND|wx.ALL,1)
        self.axes=self.figure.add_axes([0.1, 0.1, 0.8, 0.8])#新增子區域, 參數為left, bottom, width, height
        self.x=np.linspace(0,100,100)
        self.y=np.sin(2*np.pi*self.x)
        self.axes.plot(self.x,self.y)

        self.figureCanvas.draw()
        box_btn=wx.BoxSizer(wx.HORIZONTAL)
        box_btn.SetMinSize(wx.Size(-1, 50))
        self.btnBar=wx.Button(self, wx.ID_ANY,"長條圖")
        self.btnPie = wx.Button(self, wx.ID_ANY, "圓餅圖")
        box_btn.Add(self.btnBar, 1, wx.EXPAND|wx.ALL, 1)
        box_btn.Add(self.btnPie, 1, wx.EXPAND|wx.ALL, 1)
        box.Add(box_btn, 0, wx.EXPAND|wx.ALL,1)
        self.Layout()
        self.btnBar.Bind(wx.EVT_BUTTON, self.OnBarClick)
        self.btnPie.Bind(wx.EVT_BUTTON, self.OnPieClick)
        self.axes.grid()
    def OnBarClick(self, event):
        self.axes.clear()#清除原圖
        self.axes.grid(linestyle='-.')#增加格
        self.axes.set(xlim=[0,20], ylim=[0,1], title="Bar")
        self.axes.set_aspect("auto")#回復自動比例
        self.axes.set_ylim(0,1, emit=True,auto=True)
        x=np.linspace(0,20,20)
        uniform_samples = np.random.uniform(size=20)#產生20組介於0與1之間均勻分配隨機變數
        self.axes.bar(x,uniform_samples)
        self.figureCanvas.draw()
    def OnPieClick(self, event):
        self.axes.clear()
        labels = ["day1", "day2", "day3", "day3", "day5", "day6"]
        word_size = [2000, 3250, 4600, 2300, 3600, 5600]
        explode = [0, 0, .05, 0, 0, 0]#0 表示不凸出, 值越大凸越大
        self.axes.pie(word_size, explode=explode, labels=labels, autopct="%3.1f%%")
        self.figureCanvas.draw()
app=wx.App()
frame=MainFrame(None)
frame.Show()
app.MainLoop()

matplotlib_4

todo

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *