如何用一个Check按钮控制Matplotlib中两个绘图的显示/隐藏?
问题分析与修正
核心错误
你的代码里有两个关键问题导致只能控制一个绘图:
and赋值逻辑错误:p = ax.scatter(...) and ax.scatter(...)中,Python的and运算符会返回最后一个“真值”对象,所以p实际上只保存了第二个散点的实例,第一个散点的对象直接丢失,自然无法控制它的显示状态。- 列表仅包含单个对象:
lines = [p]里只有第二个散点,回调函数只能操作这个对象,完全没关联到第一个散点。
修正后的代码
import matplotlib.pyplot as plt from matplotlib.widgets import CheckButtons fig = plt.figure() ax = fig.add_subplot(projection='3d') # 分别保存两个散点实例,避免对象丢失 scatter1 = ax.scatter(5,6,7) scatter2 = ax.scatter(1,2,3, color='red', marker='+', s=1e2) # 将两个散点都纳入控制列表 lines = [scatter1, scatter2] labels = ["Hide/Show"] def func1(label): # 遍历所有绘图对象,统一切换可见性 for scatter in lines: scatter.set_visible(not scatter.get_visible()) fig.canvas.draw() a = [True] ax_check = plt.axes([0, 0.01, 0.25, 0.25]) plot_button = CheckButtons(ax_check, labels, a) plot_button.on_clicked(func1) plt.show()
关键改动说明
- 分开存储散点对象:不再用
and合并赋值,而是分别保存两个scatter的返回值,确保两个绘图实例都被保留。 - 回调函数批量控制:因为需要一个按钮控制两个图,点击时循环遍历
lines里的所有元素,统一切换它们的可见状态。 - 移除冗余导入:代码里导入的
pandas、numpy、math并未实际使用,删除后让代码更简洁。
内容的提问来源于stack exchange,提问作者LinLin
相关产品推荐
相关产品推荐

