コード例 #1
0
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