matplotlib 动态绘图与交互模式详解:plt.ion() 和 plt.ioff() 的使用

林舟
林舟
发布时间:2026-10-14 | 3人浏览过
原创

本文详解 matplotlib 中阻塞模式与交互模式的区别。通过 plt.ion() 开启交互模式实现动态曲线绘制,利用 plt.ioff() 关闭交互模式防止窗口闪退。对比两种模式下 plt.show() 的行为差异,提供同时显示多窗口及动态拟合数据的完整代码示例。

matplotlib 显示模式概述

在 Python 的学习旅程中,难免会遇到各种技术难点。为了便于日后回顾与查阅,本文将记录并解析一个关于 matplotlib 可视化库的实际应用问题。

交互模式与多窗口显示

在使用 matplotlib 进行绘图时,用户常发现无法同时展示多个图表窗口。这源于 matplotlib 默认的显示模式为阻塞(block)模式。所谓阻塞模式,是指调用 plt.show() 后,程序执行流会暂停等待用户关闭图像窗口,只有手动关闭窗口后,后续代码才会继续执行。若希望在不关闭当前图像的情况下继续执行代码或展示动态效果,需将显示模式切换为交互(interactive)模式,这可以通过调用 plt.ion() 函数实现。在交互模式下,即使脚本中包含 plt.show(),程序也不会暂停,而是继续执行后续指令。以下代码演示了如何在交互模式下同时打开并显示两个独立的图像窗口:

多窗口显示代码示例


  import matplotlib.pyplot as plt
  plt.ion()  # 打开交互模式
  # 同时打开两个窗口显示图片
  plt.figure() #图片一
  plt.imshow(i1)
  plt.figure()  #图片二
  plt.imshow(i2)
  # 显示前关掉交互模式
  plt.ioff()
  plt.show()

动态绘图实现

值得注意的是,在调用 plt.show() 之前,必须显式调用 plt.ioff() 以关闭交互模式。若遗漏此步骤,图像窗口可能会因程序快速结束而瞬间闪退,无法停留查看。关于动态图像的具体绘制原理,请参考下方的代码实现。此处暂不展开详细解释,后续如有需要再行补充:

动态拟合完整代码


import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
 
def add_layer(inputs,in_size,out_size,activation_funiction=None):
 
  Weights = tf.Variable(tf.random_normal([in_size,out_size]))
  biases = tf.Variable(tf.zeros([1,out_size]) +0.1)
  Wx_plus_b = tf.matmul(inputs,Weights)+biases
  if activation_funiction is None:
    outputs = Wx_plus_b
  else:
    outputs = activation_funiction(Wx_plus_b)
  return outputs
 
x_data = np.linspace(-1,1,300)[:,np.newaxis]
noise = np.random.normal(0,0.05,x_data.shape)
y_data = np.square(x_data)-0.5 +noise
 
xs = tf.placeholder(tf.float32,[None,1])  
ys = tf.placeholder(tf.float32,[None,1])
 
#add hidden layer
l1 = add_layer(xs,1,10,activation_funiction=tf.nn.relu)
#add output layer
prediction = add_layer(l1,10,1,activation_funiction=None)
 
#the error between prediction and real data
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),reduction_indices=[1]))
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
 
init =tf.initialize_all_variables()
 
with tf.Session() as sess:
  sess.run(init)
 
  fig = plt.figure()
  ax = fig.add_subplot(1,1,1)
  ax.scatter(x_data,y_data)
  plt.ion()  #将画图模式改为交互模式
 
  for i in range(1000):
    sess.run(train_step,feed_dict={xs:x_data,ys:y_data})
    if i%50 ==0:
      plt.pause(0.1)
      try:
        ax.lines.remove(lines[0])
      except Exception:
        pass
      prediction_value = sess.run(prediction,feed_dict={xs:x_data})
      lines = ax.plot(x_data,prediction_value,'r-',lw=5)
 
 
      print(sess.run(loss,feed_dict={xs:x_data,ys:y_data}))
 
  plt.ioff()
  plt.show()

执行上述代码后,用户将观察到一条红色曲线随着训练过程的推进,动态地拟合数据点,直至整个训练周期结束。

阻塞模式与交互模式对比

接下来,我们将深入剖析 matplotlib 中这两种显示模式的具体差异。

在交互模式下,主要特征如下:

1. 执行 plt.plot(x) 或 plt.imshow(x) 时,图像会直接渲染显示,无需额外调用 plt.show()。

2. 若在脚本中通过 ion() 开启了交互模式,且未使用 ioff() 将其关闭,则图像窗口会立即消失(闪退)。为避免此现象,必须在 plt.show() 之前插入 ioff() 命令以恢复阻塞行为。

在阻塞模式下,主要特征如下:

1. 当前窗口未关闭前,无法打开新的图像窗口。这意味着默认情况下,用户无法像使用 Matlab 那样同时对比多个窗口。

2. 执行 plt.plot(x) 或 plt.imshow(x) 仅生成图像对象,必须调用 plt.show() 后,图像才会真正显示在屏幕上。

至此,关于 matplotlib 动态绘图及 plt.ion() 与 plt.ioff() 函数的使用方法已介绍完毕。如需了解更多相关内容,建议查阅本站过往文章或继续浏览后续推荐内容。感谢大家的支持!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表