2016-09-21 61 views
0

我在面板中有一個2x2 FlexGridSizer,我想同時插入四個不同的matplotlib圖形和他們自己的工具欄。在wxPython中嵌入多個matplotlib圖形

我已經看到很多鏈接相關和工作示例嵌入一個圖,但因爲我是一個wxPython和OOP begginer,當測試一些代碼並試圖將它們與我的合併時,我感到非常困惑。

這裏是一塊頁面類wx.Notebook作用的地方,我想提出的數字

class Pagina(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 

     self.boton_descargar = wx.Button(self, -1, label=u"Descargar") 
     self.boton_desconectar = wx.Button(self, -1, label=u"Desconectar") 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     subsizer1 = wx.BoxSizer(wx.HORIZONTAL) 
     subsizer2 = wx.FlexGridSizer(rows=2, cols=2) 

     sizer.Add(subsizer1, 0, wx.EXPAND | wx.ALL, 0) 
     sizer.Add(subsizer2, 1, wx.EXPAND | wx.ALL, 0) 
     sizer.Add(self.boton_desconectar, 0, wx.ALIGN_RIGHT | wx.RIGHT, 10) 
     subsizer1.Add(self.boton_descargar, 0, wx.ALL, 10) 

     self.Bind(wx.EVT_BUTTON, self.onClick_descargar, self.boton_descargar) 
     self.Bind(wx.EVT_BUTTON, self.onClick_desconectar, self.boton_desconectar) 

     self.SetSizer(sizer) 

    def onClick_descargar(self, event): 
     HiloDescarga() 

    def onClick_desconectar(self, event): 
     pass 

HiloDescarga實際上是推出下載一些文本行線程,處理數據,並繪製這種方式(第四圖是同樣的東西):

import matplotlib.pyplot as plt 

line, = plt.plot(range(len(x)), x, '-', linewidth=1) 
line, = plt.plot(range(len(x)), f, 'y-', linewidth=1) 
plt.xlabel('x') 
plt.ylabel('y') 
plt.title(r'title1') 
plt.grid() 
plt.figure() 

line, = plt.plot(range(len(y)), y, 'r-', linewidth=1) 
line, = plt.plot(range(len(y)), g, 'y-', linewidth=1) 
plt.xlabel('x') 
plt.ylabel('y') 
plt.title(r'title2') 
plt.grid() 
plt.figure() 

line, = plt.plot(range(len(z)), z, 'g-', linewidth=1) 
line, = plt.plot(range(len(z)), h, 'y-', linewidth=1) 
plt.xlabel('x') 
plt.ylabel('y') 
plt.title(r'title3') 
plt.grid() 

plt.show() 

所以這些數字只是在分開的窗口中彈出。如果你能給我一個片段,或者至少有一些方向,也許對繪圖代碼做一些改變,但我不知道。歡迎任何幫助。

回答

2

你只需要按照他們嵌入一個圖的例子,而是爲你想要創建的每個圖形實例化幾個成員。 下面是一個簡單的例子:

import matplotlib 
matplotlib.use('WXAgg') 
from matplotlib.figure import Figure 
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas 
import wx 


class MyFrame(wx.Frame): 
    def __init__(self, parent, nbFigures=4): 
     super(MyFrame, self).__init__(parent) 
     sizer = wx.BoxSizer(wx.VERTICAL) 
     self.figs = [Figure(figsize=(2,1)) for _ in range(nbFigures)] 
     self.axes = [fig.add_subplot(111) for fig in self.figs] 
     self.canvases = [FigureCanvas(self, -1, fig) for fig in self.figs] 
     for canvas in self.canvases: 
      sizer.Add(canvas, 0, wx.ALL, 5) 
     self.SetSizer(sizer) 

app = wx.App() 
frm = MyFrame(None) 
frm.Show() 
app.MainLoop() 

enter image description here

我已經保存在陣列self.figs每幅圖的每幅圖片的軸的每個實例的實例,並在self.axes

希望這使你在正確的軌道上

+0

我要在一分鐘內試試這個。但我有一個疑問。爲繪圖任務啓動一個新線程是一個好主意嗎?我獨立的繪圖腳本需要一段時間才能完成。 – Javier

+0

對不起,不能真正幫助你 –