【问题标题】:How to modify matplotlib fig, ax objects through interact wrapped function?如何通过交互包装函数修改matplotlib fig、ax 对象?
【发布时间】:2019-06-14 15:02:07
【问题描述】:

我想在函数外部创建 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.我曾尝试将斧头作为论据传递,但仍然没有运气。如果您在包装函数内创建无花果、ax,或者只使用 plt.plot 而不是 ax.plot,它会起作用,但我希望能够创建无花果, ax 在包装函数之外,然后仅修改内部内容以加快交互滑块更改时的渲染时间。任何建议将不胜感激。

【问题讨论】:

  • 以下答案对您有用吗?有什么反馈吗?
  • 感谢您的帮助和出色的代码,但 matplotlib 笔记本后端对我不起作用,因为我使用的是 Jupyter Lab,它抛出了“Javascript 错误:未找到 IPython”。如果我改为运行 jupter 笔记本,它确实有效,但是之前的绘图没有被删除,并且在更改滑块时新点只是重叠(不需要)。我认为在函数内部创建 fig, ax 就可以了,因为这不是一项昂贵的操作。否则,我可以在交互函数中使用ax = plt.gca(),然后在这些轴上绘图。不过谢谢!

标签: python matplotlib ipywidgets


【解决方案1】:

我正在使用 JuPyter 笔记本。当我使用 %matplotlib inline 时,您的代码对我不起作用,但它与 %matplotlib notebook 后端一起使用,并进行了以下两个更改(由注释 # 突出显示)。 here之前也有人问过类似的问题

%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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 2020-09-18
    • 2011-04-24
    • 2015-09-20
    • 2012-09-22
    • 1970-01-01
    • 2013-06-05
    相关资源
    最近更新 更多