Matplotlib и Kivy: как эффективно обновлять оси вставки xlim и ylim?

Я пытаюсь создать плоттер данных, используя matplotlib в графическом интерфейсе на основе Kivy. У меня есть 48 полиномов на том же графике, что и Line2D. Некоторые из них могут пересекаться во многих точках. Таким образом, мне нужно иметь оси вставки, чтобы представить параметр масштабирования. Я обновляю массив позиций с помощью обратного вызова on_touch_move и перерисовываю график в запланированном обратном вызове, используя Clock.schedule_interval. Проблема в том, что обновление врезки происходит очень медленно. В Windows это занимает 70 мс, что незначительно, но в Android это очень тормозит. Справочный фрагмент ниже.

`

      def plot_graph(self):
    self.fig, self.ax = plotter.subplots(1, 1)
    self.axin = inset_axes(self.ax, width=4, height=2)
    self.fig.tight_layout()
    for data in data_set:
        line, = self.ax.plot(data)
        self.axin.plot(data)
    self.add_widget(FigureCanvasKivyAgg(self.fig))
    Clock.schedule_interval(self.update_inset, .1)  # .2 does not work also
    mark_inset(self.ax, self.axin, loc1=1, loc2=3)

def on_touch_move(self, touch):
    if self.collide_point(*touch.pos):
        point = self.ax.transData.inverted().transform(touch.pos)
        self.inset_points = point[0] - 2.5, point[0] + 2.5, point[1] - .25, point[1] + .25

def update_inset(self, *args):
    if len(self.inset_points) == 4:     # To avoid crashes before graph drawn
        self.axin.set_xlim(self.inset_points[0], self.inset_points[1])
        self.axin.set_ylim(self.inset_points[2], self.inset_points[3])
        self.axin.figure.canvas.draw()

`

Я пробовал funcAnimation, но не помогло, так как он не совместим с Kivy. Планирование кажется лучшим способом обновления, но оно должно быть быстрее, по крайней мере, для Android.

0 ответов

Другие вопросы по тегам