Python库matplotlib之三
- 小部件(widget)
- 小部件的基类
- connect_event
- disconnect_events()
- Button
- disconnect
- on_clicked
- 应用实列
- CheckButtons
- 构造器
- APIs
- 应用实列
小部件(widget)
小部件(widget)可与任何GUI后端一起工作。所有这些小部件都要求预定义一个Axes实例,并将其作为第一个参数传递。 Matplotlib不会试图布局这些小部件,所以,您必须自己决定Axes的宽度和高度,以便容纳这些小部件。
小部件的基类
词法:class matplotlib.widgets.AxesWidget(ax)
该小部件连接到单个Axes。
为了保证小部件保持响应,并且防止被垃圾收集,用户应该维护对该对象的引用。
这是必要的,因为回调登记仅维护函数的弱引用,这些函数是小部件的成员函数。如果没有对小部件对象的引用,它可能会被垃圾收集,这将断开回调。
connect_event
词法:connect_event(event, callback)
将回调函数与事件连接起来。
这应该用来代替figure.canvas.mpl_connect,因为该函数存储回调ID以供以后清理。
disconnect_events()
词法:disconnect_events()
断开此小部件创建的所有事件。
Button
Button的属性
- ax,是一个Axes,Button将在其中显示。
- label,一个文本实例。
- color,按钮未悬停时的颜色。
- hovercolor,悬停时按钮的颜色。
词法:matplotlib.widgets.Button(ax, label, image=None, color=‘0.85’, hovercolor=‘0.95’, *, useblit=True)
为了使按钮保持响应,您必须保留对其的引用。调用on_clicked 连接到按钮
参数说明
- ax,变量类型是Axes。按钮将被放置到的 Axes 实例。
- label,变量类型是字符串。按钮文本。
- image,变量类型是array-like或者PIL Image。如果不是None,要放置在按钮中的图像。参数直接转发给imshow。
- color,变量类型是color。按钮未激活时的颜色。
- hovercolor,变量类型是color。当鼠标悬停在按钮上时按钮的颜色。
- useblit,变量类型是bool,默认值为True
如果后端支持,请使用位块传送,以加快绘制速度。
disconnect
词法:disconnect(cid)
删除连接ID为cid的回调函数。
on_clicked
词法:on_clicked(func)
将回调函数 func 连接到按钮单击事件。返回一个连接id,这个id可用于断开连接回调。
应用实列
freqs = np.arange(0.2, 2, 0.3)
fig, ax = plt.subplots()
ax.set_ylabel('Frequency', color='#00ff00')
ax.set_xlabel('Time', color='#0000ff')
ax.set_facecolor('#eafff5')
plt.subplots_adjust(bottom=0.2)
t = np.arange(0.0, 10.0, 0.01)
s = np.sin(2*np.pi*freqs[0]*t)
l, = plt.plot(t, s, lw=2)
class Index:
ind = 0
def reset(self, event):
self.ind = 0
i = self.ind % len(freqs)
ydata = np.sin(2*np.pi*freqs[i]*t)
l.set_ydata(ydata)
l.set_color("#0000FF")
plt.draw()
def next(self, event):
self.ind += 1
i = self.ind % len(freqs)
ydata = np.sin(2*np.pi*freqs[i]*t)
l.set_ydata(ydata)
l.set_color("#00FF00")
plt.draw()
if __name__ == "__main__":
callback = Index()
axnext = plt.axes([0.81, 0.05, 0.1, 0.075])
ax_reset = plt.axes([0.70, 0.05, 0.1, 0.075])
bnext = Button(axnext, 'Next', color='#00FF00', hovercolor='#00FFFF')
bnext.on_clicked(callback.next)
b_reset = Button(ax_reset, 'Reset', color='#FF0000', hovercolor='#00FFFF')
b_reset.on_clicked(callback.reset)
plt.show()
CheckButtons
CheckButtons的属性
- ax,是一个Axes,CheckButtons将在其中显示。
- labels,是一个Text表。CheckButton的文本标签对象。
构造器
matplotlib.widgets.CheckButtons(ax, labels, actives=None, *, useblit=True, label_props=None, frame_props=None, check_props=None)
这个构造器构造一组GUI的检查按钮。为了始终保持检查按钮的响应,必须保留对此对象的引用。
使用 on_clicked 方法连接到 CheckButton。
参数说明
- ax,这个参数类型是Axes。Button将在这个Axes中显示。
- labels,这个参数类型是一个字符串表,检查按钮的标签。
- actives,这个参数类型是一个bool值表, 这个参数是可选的。指示CheckButton的初始状态。该列表的长度必须与标签列表的长度相同。如果未给出,则所有CheckButton状态都将是uncheck。
- useblit,这个参数类型bool,默认值为True。如果后端支持,使用位块传送,以加快绘制速度。
- label_props,这个参数类型是dict,是可选。用于标签的Text属性字典。
- frame_props,这个参数类型是dict,是可选。scatter的Collection属性的字典,用于复选按钮框架。
- check_props,这个参数类型是dict,是可选。scatter的Collection属性的字典,用于检查按钮检查。
APIs
函数名 | 功能 |
---|---|
clear() | Uncheck all checkboxes |
disconnect(cid) | 删除连接ID为cid的观察者 |
get_checked_labels() | 返回用户当前检查的标签列表 |
get_status() | 返回所有检查按钮的状态(True/False)列表 |
on_clicked(func) | 将回调函数 func 连接到按钮单击事件。 |
set_active(index, state=None) | 通过索引修改复选按钮的状态。如果 eventon 为 True,则会触发回调。 |
set_check_props(props) | 设置检查按钮检查的属性。 |
set_frame_props(props) | 设置复选按钮框架的属性。 |
set_label_props(props) | 设置文本标签的属性。 |
应用实列
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import CheckButtons
freqs = np.arange(0.2, 2, 0.3)
global w_check
fig, ax = plt.subplots()
ax.set_ylabel('Frequency', color='#00ff00')
ax.set_xlabel('Time', color='#0000ff')
ax.set_facecolor('#eafff5')
plt.subplots_adjust(left=0.3, bottom=0.1, right=0.9, top=0.9, wspace=0.2, hspace=0.2)
plt.subplots_adjust(bottom=0.25)
t = np.arange(0.0, 10.0, 0.01)
s = np.sin(2*np.pi*freqs[0]*t)
l, = plt.plot(t, s, lw=2)
def on_clicked(label):
global w_check
index = labels.index(label)
l_status = w_check.get_status()
s = ''
for x in l_status:
if x == True:
s += 'FF'
else:
s += '00'
color = '#'+s
l.set_color(color)
plt.draw()
if __name__ == "__main__":
global w_check
ax = plt.axes([0.01, 0.5, 0.13, 0.4])
labels = ["Red", "Blue", "Green"]
check_status = [False, True, False]
w_check = CheckButtons(ax, labels, check_status)
w_check.on_clicked(on_clicked)
plt.show()