jupyte中动态更新matplotlib的曲线

使用python进行数值实验的时候,我们常常会在程序运行结束之后利用matplotlib绘制出结果的曲线。问题是,当程序需要运行很长世间的时候,我们不能立即查看出图的效果。

错误做法

如果简单地多次调用plot,几次绘制的曲线会堆在一个图里:

for i in range(5):
    x = list(range(i, i+5))
    y = [xx**2 for xx in x]
    plt.plot(x, y)
    plt.show()

在这里插入图片描述


简单地使用clf清除画布,中间sleep的时候是没有图像输出的,只能看到最后的输出

for i in range(5):
    x = list(range(i, i+5))
    y = [xx**2 for xx in x]

	# 清空figure
    plt.clf()
    plt.plot(x, y)
    plt.show()
    time.sleep(1)

在这里插入图片描述


当然我们可以尝试清空display的内容,这样子图片确实可以更新,但是运行过程中打印的值全部都会丢失。(如下图中只剩下最后的i=4

import IPython
for i in range(5):
    x = list(range(i, i+5))
    y = [xx**2 for xx in x]
    
    # 清空display
    IPython.display.display(plt.gcf())
    IPython.display.clear_output(wait=True)
    
    plt.plot(x, y)
    plt.show()
    print('i={}'.format(i))
    time.sleep(1)

在这里插入图片描述

优雅方法

最优雅的方式是使用matplotlib中axis的set_data方法,实时更新曲线。

#打开matplotlib的交互显示模式
%matplotlib notebook

plt.figure()
#绘制一条空曲线,令下面ax.lines里不为空
plt.plot([], [])

#获取当前figure和axis
fig = plt.gcf()
ax = plt.gca()

for i in range(5):
    x = list(range(i, i+5))
    y = [xx**2 for xx in x]
    
    # 更新数据
    ax.lines[0].set_data(x, y)

	#重置已有曲线的的坐标轴时,要先解除限制(见ax.autoscale_view的官方文档)
    ax.relim()
    #重设坐标轴,让图像更协调
    ax.autoscale_view()
    
    # 显示图片
    fig.canvas.draw()
    
    # 正常打印
    print(i)
    time.sleep(1)

在这里插入图片描述

同时实现了图像持续更新和文字正常输出。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值