首页 > 解决方案 > 如何通过交互包装函数修改matplotlib fig、ax 对象?

问题描述

我想在函数外部创建 fig、ax 对象,然后从函数内部修改 ax。当我的函数是典型的 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()

当您使用交互包装函数时,它不会修改 ax. 我曾尝试将斧头作为论据传递,但仍然没有运气。如果您在包装函数内创建 fig, ax ,或者只使用plt.plot而不是ax.plot ,它可以工作,但我希望能够在包装函数之外创建 fig, ax 然后只修改里面的内容加快交互滑块更改的渲染时间。任何意见,将不胜感激。

标签: pythonmatplotlibipywidgets

解决方案


我正在使用 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)

推荐阅读