复选框是图形化界面(GUI)中常见的控件,matplotlib
中的复选框属于部件(widgets),matplotlib
中的部件都是中性(neutral )
的,即与具体后端实现无关。
复选框具体实现定义为matplotlib.widgets.CheckButtons
类,继承关系为:Widget->AxesWidget->CheckButtons
。
CheckButtons
类的签名为class matplotlib.widgets.CheckButtons(ax, labels, actives=None)
CheckButtons
类构造函数的参数为:
ax
:放置复选框的容器,类型为matplotlib.axes.Axes
的实例。labels
:复选框文本列表,类型为字符串列表。actives
:复选框的初始选中状态列表,类型为布尔列表,默认值为None
,所有复选框均为未选中状态。CheckButtons
类的属性为:
ax
:放置按钮的容器,类型为matplotlib.axes.Axes
的实例。labels
:复选框文本列表。rectangles
:复选框中的□
图形对象,类型为Rectangle
列表。lines
:复选框被选中时的x
图形对象,类型为(Line2D
, Line2D
) 元组列表。CheckButtons
类最常用的方法为:
on_click
:参数为回调函数,用于绑定复选框选中事件。get_status
:无参数,用于返回复选框选中状态,返回值类型为布尔元组。set_active(index)
:根据复选框的索引切换选中/未选中状态。https://matplotlib.org/gallery/widgets/check_buttons.html
通过复选框选中显示曲线。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import CheckButtons
t = np.arange(0.0, 2.0, 0.01)
s0 = np.sin(2*np.pi*t)
s1 = np.sin(4*np.pi*t)
s2 = np.sin(6*np.pi*t)
# 绘制三条曲线
fig, ax = plt.subplots()
l0, = ax.plot(t, s0, visible=False, lw=2, color='k', label='2 Hz')
l1, = ax.plot(t, s1, lw=2, color='r', label='4 Hz')
l2, = ax.plot(t, s2, lw=2, color='g', label='6 Hz')
# 调整子图大小,在左侧留出复选框区域
plt.subplots_adjust(left=0.2)
lines = [l0, l1, l2]
# 构造复选框实例化时用到的属性
# 创建复选框的容器子图
rax = plt.axes([0.05, 0.4, 0.1, 0.15])
# 创建复选框的标签列表,标签自动对应曲线的标签
labels = [str(line.get_label()) for line in lines]
# 根据对应曲线可见状态初始化复选框初始状态
visibility = [line.get_visible() for line in lines]
# 构造复选框实例
check = CheckButtons(rax, labels, visibility)
# 创建复选框选中事件的回调函数,注意回调函数的参数默认为选中复选框的label
def func(label):
index = labels.index(label)
# 根据选中状态设置对应曲线的可见属性
lines[index].set_visible(not lines[index].get_visible())
# 注意!matplotlib中出现窗体之后的交互中如果修改图像需要重绘图像
plt.draw()
# 绑定复选框选中事件
check.on_clicked(func)
print(check.labels,check.lines,check.rectangles,check.get_status(),check.get_active())
plt.show()
以下为CheckButtons
类部分源码,根据源码可知,复选框选中事件在内部绑定的是_clicked
方法,_clicked
方法最终会调用set_active(i)
方法,参数i
为复选框的索引,set_active(i)
方法最终调用func(self.labels[index].get_text())
,func
为on_clicked
方法绑定的回调函数。所以回调函数func
必须调用1个参数即当前选中的复选框的文本标签,如果在定义回调函数时不定义参数就会报错。
self.connect_event('button_press_event', self._clicked)
def _clicked(self, event):
if self.ignore(event) or event.button != 1 or event.inaxes != self.ax:
return
for i, (p, t) in enumerate(zip(self.rectangles, self.labels)):
if (t.get_window_extent().contains(event.x, event.y) or
p.get_window_extent().contains(event.x, event.y)):
self.set_active(i)
break
def set_active(self, index):
"""
Toggle (activate or deactivate) a check button by index.
Callbacks will be triggered if :attr:`eventson` is True.
Parameters
----------
index : int
Index of the check button to toggle.
Raises
------
ValueError
If *index* is invalid.
"""
if not 0 <= index < len(self.labels):
raise ValueError("Invalid CheckButton index: %d" % index)
l1, l2 = self.lines[index]
l1.set_visible(not l1.get_visible())
l2.set_visible(not l2.get_visible())
if self.drawon:
self.ax.figure.canvas.draw()
if not self.eventson:
return
for cid, func in self.observers.items():
func(self.labels[index].get_text())
def on_clicked(self, func):
"""
Connect the callback function *func* to button click events.
Returns a connection id, which can be used to disconnect the callback.
"""
cid = self.cnt
self.observers[cid] = func
self.cnt += 1
return cid
复选框的使用流程总结如下:
ax
。CheckButtons
构造复选框,三个参数中ax
为容器子图,labels
为复选框的文本列表,actives
为复选框初始选中状态的布尔列表。on_clicked
方法绑定选中事件,参数为回调函数。回调函数定义时只能有一个参数,其值在调用时自动赋值为当前选中复选框的标签文本。