Python matplotlib.pyplot.draw()在不同版本中的差别导致界面绘制异常问题

Ubuntu系统上进行如下配置:

$ sudo apt-get update

$ sudo apt-get upgrade

$ sudo apt-get install python-dev

$ sudo apt-get install python-pip

$ sudo pip install --upgrade pip

$ sudo pip install --upgrade urllib3

$ sudo pip install numpy

$ sudo pip install matplotlib

之后执行如下测试代码:

import sys
import numpy as np
import matplotlib.pyplot as plt

plt.ion()
(fig, axis) = plt.subplots()
bar_plot = axis.barh(0, 8,linewidth = 0)
bar_plot.color= '#ffff00'
for i in range(20):
    axis.set_xlim(xmax = max(i + 1, 10))
    plt.draw()

if sys.version_info < (3, 0):
    raw_input("Press Enter to continue...")
else:
    input("Press Enter to continue...")

上面的测试代码在Ubuntu 14.04.5版本上是可以正常执行的,对应的matplotlib的版本是matplotlib 1.3.1,但是放到Ubuntu 16.04.2系统上则是无法正常显示的,对应的matplotlib的版本是matplotlib 1.5.1

造成这个问题的原因在于matplotlib.pyplot.draw(),这个函数行为的改变,早期这个函数是同步更新界面的,后来的版本却变成了空闲异步更新界面,只有当matplotlib.pyplot.pause(interval)被调用的时候才会刷新界面。

所以只需要上面的代码修改成如下即可在不同版本之间兼容:

import sys
import numpy as np
import matplotlib.pyplot as plt

plt.ion()
(fig, axis) = plt.subplots()
bar_plot = axis.barh(0, 8,linewidth = 0)
bar_plot.color= '#ffff00'
for i in range(20):
    axis.set_xlim(xmax = max(i + 1, 10))
    plt.draw()
    plt.pause(0.00001)

if sys.version_info < (3, 0):
    raw_input("Press Enter to continue...")
else:
    input("Press Enter to continue...")

注意,我们在matplotlib.pyplot.draw()调用后面增加了matplotlib.pyplot.pause(interval)的调用。

貌似调用fig.canvas.flush_events()更合适

查看matplotlib的版本使用如下代码:

import matplotlib as mpl
print mpl.__version__

参考链接


发布者

《Python matplotlib.pyplot.draw()在不同版本中的差别导致界面绘制异常问题》上有1条评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注