2015-10-20 33 views
0

我有嵌入的wxPython面板seaborn barplot,像这样:Seaborn禁用情节

enter image description here

被点击的(大)按钮时,条形图绘制。这是我做了什么来完成它:

class SamplePanel(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 
     self.figure = Figure() 
     self.ax = self.figure.add_subplot(111) 

     self.x = np.array(list('XYZV')) 
     self.y = np.array([200,400,300,20]) 

     self.ax.set_ylabel("Sample numbers")   

     self.canvas = FigureCanvas(self, -1, self.figure) 
     self.button = wx.Button(self, label="Plot data", pos=(100,15)) 
     self.button.Bind(wx.EVT_BUTTON, self.OnButtonClick) 

     self.sizer = wx.BoxSizer(wx.VERTICAL) 
     self.sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW) 
     self.sizer.Add(self.button, 1, wx.LEFT | wx.TOP | wx.GROW) 
     self.SetSizer(self.sizer) 
     self.Fit() 

    def OnButtonClick(self,event): 
     sns.barplot(self.x, self.y, palette="BuGn_d", ax=self.ax) 


if __name__ == "__main__": 
    app = wx.PySimpleApp() 
    frame = wx.Frame(None, title='Sample bar plot') 
    panel = SamplePanel(frame) 
    frame.Show() 
    app.MainLoop() 

我有两个问题:

  • 我如何可以禁用/画当我点击按钮的情节?也就是说,如果我点击这个按钮,那么这个图就会出现。如果我再次点击的情节消失了,我再和一个空的原始视图,就像这样: enter image description here

    • 此外,当我将窗口最大化情节的惟一变化,我能怎样改变是立竿见影,作为我点击按钮后?

有什么建议吗?在此先感谢

回答

1

它会帮助很多,如果你已经发布了可运行的小例子。幸运的是,Google帮我弄清楚了需要什么。基本上你需要设置一些变量来跟踪你是否点击了按钮。或者你可以使用一个wx.ToggleButton,而不是一个普通wx.Button

为了让图形显示不调整框架,你只需要调用self.Layout()

要清除的数字,你需要做的是这样self.ax.cla()self.ax.clear()。下面是为我工作一个完整的例子:

import numpy as np 
import seaborn as sns 
import wx 

from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas 
from matplotlib.figure import Figure 

class SamplePanel(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 
     self.toggled = False 
     self.figure = Figure() 
     self.ax = self.figure.add_subplot(111) 

     self.x = np.array(list('XYZV')) 
     self.y = np.array([200,400,300,20]) 

     self.ax.set_ylabel("Sample numbers") 

     self.canvas = FigureCanvas(self, -1, self.figure) 
     self.button = wx.Button(self, label="Plot data", pos=(100,15)) 
     self.button.Bind(wx.EVT_BUTTON, self.OnButtonClick) 

     self.sizer = wx.BoxSizer(wx.VERTICAL) 
     self.sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW) 
     self.sizer.Add(self.button, 1, wx.LEFT | wx.TOP | wx.GROW) 
     self.SetSizer(self.sizer) 
     self.Fit() 

    def OnButtonClick(self, event): 
     if not self.toggled: 
      sns.barplot(self.x, self.y, palette="BuGn_d", ax=self.ax) 
      self.toggled = True 
     else: 
      self.ax.cla() 
      self.toggled = False 
     self.Layout() 


if __name__ == "__main__": 
    app = wx.App(False) 
    frame = wx.Frame(None, title='Sample bar plot', size=(800,600)) 
    panel = SamplePanel(frame) 
    frame.Show() 
    app.MainLoop() 

还要注意的是wx.PySimpleApp已被弃用。我将其换为创建应用程序对象的推荐方法。

+0

谢谢您的帮助! – MrPedru22