Matplotlib - 关闭事件



在编程和软件设计的背景下,事件指的是软件识别的一个动作或事件。这些事件可以由系统、用户输入或其他来源发起,并由软件进行处理。

具体来说,关闭事件是在软件界面中关闭图形时触发的事件。此事件表示与图形相关的图形表示或窗口的终止或关闭,并提醒软件相应地做出响应。

Matplotlib 中的关闭事件

Matplotlib 提供了一套处理事件的工具,其中包括处理关闭事件的能力。Matplotlib 中的关闭事件发生在关闭图形窗口时,会在 Python 脚本中触发特定操作。通过连接到 close_event,您可以执行自定义代码以响应图形的关闭。

在本教程中,我们将探讨如何在 Matplotlib 中使用关闭事件来增强交互式绘图。

示例

这是一个简单的示例,当用户关闭图形时显示一条消息。

import matplotlib.pyplot as plt

def on_close(event):
   print('The Figure is Closed!')

fig, ax = plt.subplots(figsize=(7, 4))
ax.annotate('X', xy=(1, 1), xytext=(0.9, 0.65), fontsize=20,
   arrowprops=dict(facecolor='red'),
   horizontalalignment='left',
   verticalalignment='bottom')

fig.canvas.mpl_connect('close_event', on_close)

ax.text(0.15, 0.5, 'Close This Figure!', dict(size=30))
plt.show()

输出

执行上述代码后,我们将得到以下输出:

close_event_ex1

关闭上述输出图形后,控制台将显示以下消息:

The Figure is Closed!

检测已关闭的坐标轴

当在一个图形中处理多个坐标轴时,需要确定特定坐标轴是否已关闭,可以使用 Matplotlib 中的关闭事件操作。

示例

这是一个演示如何使用 Matplotlib 中的关闭事件来确定特定坐标轴是否已关闭的示例。

import matplotlib.pyplot as plt

# Function to handle the event 
def on_close(event):
   event.canvas.figure.axes[0].has_been_closed = True
   print('The Figure is Closed!')

# Create the figure 
fig, ax = plt.subplots(figsize=(7, 4))
ax.set_title('Detecting Closed Axes')
ax.has_been_closed = False
ax.plot(range(10))

# connect the event with the callable function
fig.canvas.mpl_connect('close_event', on_close)

plt.show()
print('Check the attribute has_been_closed:', ax.has_been_closed)

输出

执行上述程序后,您将得到以下输出:

close_event_ex2

关闭上述输出图形后,控制台将显示以下消息:

The Figure is Closed!
Check the attribute has_been_closed: True

关闭后继续执行代码

在某些情况下,即使在图形关闭后(关闭事件触发),也可能需要代码继续运行。这对于后台进程或动画尤其有用。

示例

以下示例演示如何在关闭图形后继续执行代码。

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np
import time

close_flag = 0

def handle_close(evt):
   global close_flag
   close_flag = 1
   print('The Figure is Closed!')

# Activate interactive mode
plt.ion()  
fig, ax = plt.subplots()

# listen to close event
fig.canvas.mpl_connect('close_event', handle_close)

# Generating x values 
x = np.arange(0, 2*np.pi, 0.01)
y = np.sin(x)

# Plotting the initial sine curve
line, = ax.plot(x, y)
ax.legend([r'$\sin(x)$'])

# Function to update the plot for each frame of the animation
def update(frame):
   line.set_ydata(np.sin(x + frame / 50))
   return line

t = 0
delta_t = 0.1
while close_flag == 0:
   if abs(t - round(t)) < 1e-5:
      print(round(t))
    
   x = x + delta_t
   y = y - delta_t

   # Creating a FuncAnimation object
   ani = animation.FuncAnimation(fig=fig, func=update, frames=40, interval=30)

   # draw the figure
   fig.canvas.draw() 
   fig.canvas.flush_events() 

   # wait a little bit of time
   time.sleep(delta_t) 

   t += delta_t

   if close_flag == 1:
      break

print('ok')

输出

执行上述程序后,您将得到以下输出:

close_event_ex3

关闭上述输出图形后,控制台将显示以下消息:

0
1
2
3
4
5
The Figure is Closed!
ok

观看下面的视频,了解此处关闭事件功能的工作方式。

close_event_ex3 gif
广告