2015-10-20 4 views
0

У меня есть Сиборн barplot встроенный в панель WxPython, как это: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

Смежные вопросы