python - Jupyter Notebook:使用 ipywidgets 时使用的重复散点图
问题描述
我正在尝试使用复选框控制散点图的显示。当我使用交互功能构建它时,它按预期工作。该图根据复选框中的值显示或隐藏。
import matplotlib.pyplot as plt
from ipywidgets import interact, widgets
%matplotlib inline
def on_change(Display):
if Display == True:
plt.scatter(x,y)
plt.show()
return Display
interact(on_change, Display=False);
当我每次单击复选框时都尝试使用观察功能做同样的事情时,我会在下面显示一个附加图。我需要做什么才能让它重新绘制相同的图,使其像上面的示例一样工作?
我想交互示例中的某些内容正在清除显示,但不清楚如何手动执行此操作。
import matplotlib.pyplot as plt
from ipywidgets import interact, widgets
%matplotlib inline
x = [1,2,3,4,5,6,7,8]
y = [5,2,4,2,1,4,5,2]
def on_change(change):
if change['new'] == True:
scat = plt.scatter(x,y)
plt.show()
cb = widgets.Checkbox(False, description = "Display")
cb.observe(on_change, names='value')
display(cb)
解决方案
我对您的示例进行了一些更改,希望能证明您想要什么。我采取了更加面向对象的路线,不确定您是否特别想避免它,但它有助于实现您想要的结果,看起来您正在转向一个简单的 GUI。
1) 包括一个输出小部件 ( out
) - 基本上是一个可以像普通小部件一样显示的单元格输出。with out:
当您想要打印到特定的输出小部件时,您可以使用上下文管理器块 ( )。您还可以使用清除小部件out.clear_output()
2)在matplotlib中使用面向对象的接口而不是使用plt。我发现这更容易控制显示哪些图以及在正确的时间显示在哪个位置。
- 使用 plt.ioff() 暂时挂起交互式 matplotlib
- 用 . 创建您的图形和轴
fig, ax = plt.subplots()
。NB 图形可以有多个轴/子图,但我们只需要一个。 - 使用 将散点图数据“绘制”到您的轴
ax.scatter(x,y)
,但这不会导致它出现。 - 用 显式显示图形
display(fig)
。
我假设您希望每次选中该框时都重新绘制您的图形,因此我已将其包含在观察功能中。如果您的图形没有改变,则将其移出循环是有意义的。
import matplotlib.pyplot as plt
from ipywidgets import interact, widgets
%matplotlib inline
out = widgets.Output()
x = [1,2,3,4,5,6,7,8]
y = [5,2,4,2,1,4,5,2]
def on_change(change):
if change['new'] == True:
with out:
plt.ioff()
fig,ax = plt.subplots()
ax.scatter(x,y)
display(fig)
else:
out.clear_output()
cb = widgets.Checkbox(False, description = "Display")
cb.observe(on_change, names='value')
display(cb)
display(out)
推荐阅读
- javascript - 为什么 Object3D.getWorldPosition 不只返回一个 THREE.Vector3?
- mongodb - Mongo Source 连接器中的最终投票记录不是实时的
- javascript - 你如何将数据从一个 observable 发送到另一个 observable?
- java - 下载文件时未定义 response.data
- python - python `threading.local` 跨使用`Gunicorn` 和`eventlet` 的请求是否安全?
- objectbox - 创建和更新 ObjectBox 1:n 关系
- javascript - 在数组(JS)中查找对象的值(和键)
- javascript - 我可以使用 MySQL 查询来创建具有嵌套数组和对象的嵌套数据结构,还是需要使用 JS?
- dbt - profile.yaml 中的 dbt Redshift IAM 凭证
- .net - 如何从 appsettings.json 读取值并将其与实体框架返回的值混合