matplotlib部件(widgets)之复选框(CheckButtons)

复选框概述

复选框是图形化界面(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())funcon_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方法绑定选中事件,参数为回调函数。回调函数定义时只能有一个参数,其值在调用时自动赋值为当前选中复选框的标签文本。

你可能感兴趣的:(Matplotlib,matplotlib,widget,复选框,checkbuttons,事件)