class MatplotPanel(wx.Panel): """ From http://stackoverflow.com/a/19898295/1109980 """ def __init__(self, *args, **kwargs): wx.Panel.__init__(self, *args, **kwargs) self.subplots = None self.rows = None self.cols = None self.yerr = None self.values = None self.sizer = wx.BoxSizer(wx.VERTICAL) self.SetSizer(self.sizer) plt = plot.Plot() self.canvas = FigureCanvas(self, -1, plt.fig) self.toolbar = NavigationToolbar(self.canvas) self.sizer.Add(self.toolbar, 0, wx.EXPAND) self.sizer.Add(self.canvas, 1, wx.GROW) self.Fit() def redraw(self, agg): self.canvas.Destroy() self.toolbar.Destroy() plt = plot.Plot() kind = self.frame.plot_type.GetItemLabel( self.frame.plot_type.GetSelection()) errkind = self.frame.err_type.GetItemLabel( self.frame.err_type.GetSelection()) plt.plot(agg, kind=kind, errkind=errkind.lower()) #, within='rows') self.canvas = FigureCanvas(self, -1, plt.fig) self.toolbar = NavigationToolbar(self.canvas) self.sizer.Add(self.toolbar, 0, wx.EXPAND) self.sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW) self.Layout() def draw_empty(self): self.canvas.Destroy() self.toolbar.Destroy() plt = plot.Plot() self.canvas = FigureCanvas(self, -1, plt.fig) self.toolbar = NavigationToolbar(self.canvas) self.sizer.Add(self.toolbar, 0, wx.EXPAND) self.sizer.Add(self.canvas, 1, wx.GROW) self.Layout() def _get_items(self, parent, event=None): """ #Parent is the list where the item is being inserted """ items = [] if parent.GetItemCount() > 0: items += [ parent.GetItemText(i) for i in range(parent.GetItemCount()) ] if event is not None: if event.GetEventType() == wx.EVT_LIST_DELETE_ITEM.evtType[0]: if parent == event.GetEventObject(): idx = items.index(event.GetText()) del items[idx] if len(items) == 0: items = None return items def changePlot(self, event=None): self.subplots = self._get_items(self.frame.list_subplots, event) self.rows = self._get_items(self.frame.list_rows, event) self.cols = self._get_items(self.frame.list_cols, event) self.values = self._get_items(self.frame.list_values, event) self.yerr = self._get_items(self.frame.list_yerr, event) self.plot() def plot(self): if self.values is None or (self.cols is None and self.rows is None): self.draw_empty() else: value_type = self.frame.value_type.GetItemLabel( self.frame.value_type.GetSelection()) if value_type == 'metric': agg = stats.aggregate(self.df, subplots=self.subplots, rows=self.rows, cols=self.cols, yerr=self.yerr, values=self.values) elif value_type == 'accuracy': correct = list( self.frame.panel_corr.check_correct.GetCheckedStrings()) incorrect = list( self.frame.panel_corr.check_incorrect.GetCheckedStrings()) agg = stats.accuracy(self.df, subplots=self.subplots, rows=self.rows, cols=self.cols, yerr=self.yerr, values=self.values, correct=correct, incorrect=incorrect) #import pdb; pdb.set_trace() self.redraw(agg) self.frame.list_agg.DeleteAllItems() for i in range(self.frame.list_agg.GetColumnCount()): self.frame.list_agg.DeleteColumn(0) aggr = self.frame.list_agg.stack(agg) self.frame.list_agg.set_data(aggr) self.frame.aggr = aggr