python - 如何通过交互包装函数修改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 然后只修改里面的内容加快交互滑块更改的渲染时间。任何意见,将不胜感激。
解决方案
我正在使用 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)
推荐阅读
- ios - 如何知道 WKContentRuleList 阻止了什么
- python - 使用哪种终端仿真?
- c# - 我在 xamarin 表单中工作,我创建了类广播接收器,但没有调用 ONReceive ()?如何触发或调用此方法?
- javascript - vuex 动作中的辅助函数
- javascript - 将所有 RealtimeDB 数据同步到 Google 的工作表列
- visual-studio - 在 Visual Studio 中获取其他指标
- cordova - 如何使用这个 Custom Ionic Cordova 插件?
- javascript - 连接 Javascript 和 Java
- javascript - JS 设置间隔;我想在里面创建一个标签字符串
- python - 根据文件名列表创建文本文件