Как модифицировать matplotlib на рис, топор через интерактивную функцию? - PullRequest
1 голос
/ 14 июня 2019

Я хотел бы создать объекты «рис», «топор» вне функции, а затем изменить топор из функции.Этот подход прекрасно работает, когда моя функция является типичной функцией python, но не работает, когда функция украшена @interact или обернута взаимодействием из ipywidgets.Мне любопытно, почему перенос с интерактивом влияет на способность пропускать топор.

from ipywidgets import interact
from matplotlib import pyplot as plt
import numpy as np

fig, ax = plt.subplots(1)
def mod_ax(n=10):
    x,y = np.random.rand(n), np.random.rand(n)
    ax.scatter(x,y)
    return

# The interact wrapped function will not modify ax
interact(mod_ax, n=20)
# However, the below line works fine to modify ax; 
# comment out the interact line and comment in below line to see modified plot
# mod_ax(n=50)
plt.show()

Когда вы используете функцию интерактивного переноса, он не модифицирует топор.Я пытался передать топор в качестве аргумента, но все равно не повезло.Это работает, если вы создаете fig, ax внутри обернутой функции или просто используете plt.plot вместо ax.plot , но я хочу иметь возможность создавать fig, axза пределами обернутой функции, а затем только изменяйте содержимое внутри, чтобы ускорить время рендеринга при изменении ползунка взаимодействия.Любой совет будет оценен.

1 Ответ

0 голосов
/ 14 июня 2019

Я использую ноутбук JuPyter. Ваш код не работал для меня, когда я использую %matplotlib inline, но он работает с бэкэндом %matplotlib notebook со следующими двумя изменениями (выделено комментарием #). Подобный вопрос был задан здесь до

%matplotlib notebook # <--- Change 1
from ipywidgets import interact
from matplotlib import pyplot as plt
import numpy as np

fig, ax = plt.subplots(1)
def mod_ax(n=10):
    x,y = np.random.rand(n), np.random.rand(n)
    ax.scatter(x,y)
    fig.canvas.draw() # <--- Change 1
    return 

interact(mod_ax, n=20)
...