Быстрый способ обновления сложных сюжетов с помощью ipywidgets - PullRequest
1 голос
/ 05 апреля 2020

Я создал виджет, который использует функцию графика, которая отображает pandas гистограмму и два изображения. Для построения графика требуется несколько секунд, но, что еще хуже, график исчезает на несколько секунд, прежде чем появляется новый.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from ipywidgets import interact, interactive
from IPython.display import display


class DummyPlotter:

  def plot(self, random_state):
    plt.figure(figsize=[30,10])
    df = pd.DataFrame(data=np.random.normal(size=200), columns=['prob'])
    ax = plt.subplot(2, 1, 1)
    df.plot.bar( y='prob', ax=ax);
    # Plot Image
    ax1 = plt.subplot(2, 4, 5);
    ax1.imshow(np.random.uniform(size=[300,300]));

    # Plot Explainability Figure
    ax2 = plt.subplot(2, 4, 6);
    ax2.imshow(np.random.uniform(size=[300,300]));


dp = DummyPlotter()
w = interactive(dp.plot, random_state=10)
display(w)

Как можно предотвратить исчезновение графика до его обновления? Как я могу сделать это быстрее?

1 Ответ

0 голосов
/ 06 апреля 2020

1) Сначала вы делаете df.plot.bar() дважды, что кажется немного избыточным, вы можете удалить его?

2) Я выполнил линейный профиль вашего примера кода, столбчатая диаграмма pandas берет Дольше всего, так что начните там, чтобы сделать функцию быстрее:

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
    10                                             def plot(self, random_state):
    11         1       1834.0   1834.0      0.2      plt.figure(figsize=[30,10])
    12         1       2573.0   2573.0      0.2      df = pd.DataFrame(data=np.random.normal(size=200), columns=['prob'])
    13         1      67474.0  67474.0      5.7      ax = plt.subplot(2, 1, 1)
    14         1     997202.0 997202.0     83.5      df.plot.bar( y='prob', ax=ax);
    15                                           #     df.plot.bar()
    16                                               # Plot Image
    17         1      69439.0  69439.0      5.8      ax1 = plt.subplot(2, 4, 5);
    18         1       5004.0   5004.0      0.4      ax1.imshow(np.random.uniform(size=[300,300]));
    19                                           
    20                                               # Plot Explainability Figure
    21         1      46301.0  46301.0      3.9      ax2 = plt.subplot(2, 4, 6);
    22         1       3886.0   3886.0      0.3      ax2.imshow(np.random.uniform(size=[300,300]));

Смотрите здесь для описания

3) На ваш второй вопрос, используя интерактивный ipywidgets, окно вывода будет очистить, как только появится новое изображение. Сначала отображается ваш гистограмма, поэтому это приводит к очистке старого вывода, а затем вам нужно дождаться отображения следующих двух графиков.

4) Вы также можете сделать w = interactive(dp.plot, random_state=10, continuous_update=False), чтобы график происходит только тогда, когда вы позволяете go ползунка в определенной позиции, а не каждому значению, через которое вы перемещаете ползунок.

...