Matplotlib генерирует фигуры в отдельных кадрах, - PullRequest
0 голосов
/ 02 октября 2019

ну, у меня есть этот графический интерфейс, который показывает несколько разных цифр / графиков. Сначала у меня возникла проблема, которую я решил изменить plt.draw() на plt.show. Теперь, когда я запускаю сценарий, кажется, что он создает и показывает фигуры в своих собственных кадрах, а затем после того, как я последовательно закрываю эти кадры, в моем GUI появляются все цифры и обновляются в прямом эфире, как я хотел, но я хочу избавиться отпервые кадры, которые появляются. Я искал, но ничего не нашел по этому поводу.

Прямо сейчас это мой код, который строится и вставляется в панель. Я называю этот код и добавляю его в блокнот в графическом интерфейсе под инструментом.

class plot_panel(wx.Panel):
    def __init__(self, parent, model, x, y, title):
        wx.Panel.__init__(self, parent)
        sns.set()

        self.title = title
        self.line_width = 1

        self.figure = plt.figure(figsize=(18, 3))
        self.canvas = FigureCanvas(self, 0, self.figure)
        self.axis = self.figure.add_subplot(1, 1, 1)
        self.toolbar = NavigationToolbar(self.canvas)
        self.toolbar.Realize()

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.canvas, 0, wx.EXPAND)
        sizer.Add(self.toolbar, 0, wx.LEFT | wx.EXPAND)
        self.SetSizer(sizer)

        self.x_axis = []
        self.y_axis = []

        ani = animation.FuncAnimation(self.figure, self.animate, fargs=(self.x_axis, self.y_axis, model, x, y), interval=500)

        plt.show(block=False)

    def animate(self, i, x_axis, y_axis, model, x, y):
        with session_scope() as s:
            value = s.query(y).order_by(model.Datetime.desc()).first()
            time = s.query(x).order_by(model.Datetime.desc()).first()
            if type(time) != type(None) or type(value) != type(None):
                time = time[0]
                value = value[0]
                value = round(value, 2)

                x_axis.append(time)
                y_axis.append(value)

        x_axis = x_axis[-1800:]
        y_axis = y_axis[-1800:]

        self.axis.clear()
        self.axis.annotate(str(value), xy=(time, value), xytext=(10, -3), textcoords='offset pixels',
                           bbox=dict(boxstyle=custom_box_style, alpha=0.2))
        self.axis.set_title(self.title)
        self.axis.set_xlim(min(x_axis), max(x_axis) + timedelta(seconds=0.01))
        self.axis.set_xlabel(x.name)
        self.axis.set_ylabel(y.name)
        self.axis.plot(x_axis, y_axis, linewidth=self.line_width)

        # Format plot
        plt.subplots_adjust(left=0.2, right=0.85, top=0.92, bottom=0.2, wspace=1)

Вот как я их называю.

self.plot = ploting.plot_panel(self.plot_notebook, hygrometer_model, hygrometer_model.Datetime, hygrometer_model.H20_concentration, 'H20 Concentration vs Datetime')
self.plot_0 = ploting.plot_panel(self.plot_notebook, hygrometer_model, hygrometer_model.Datetime, hygrometer_model.total_pressure, 'Total Pressure vs Datetime')
self.plot_1 = ploting.plot_panel(self.plot_notebook, hygrometer_model, hygrometer_model.Datetime, hygrometer_model.temperature, 'Temperature vs Datetime')

self.plot_notebook.AddPage(self.plot, hygrometer_model.H20_concentration.name)
self.plot_notebook.AddPage(self.plot_0, hygrometer_model.total_pressure.name)
self.plot_notebook.AddPage(self.plot_1, hygrometer_model.temperature.name)
...