以下代码无法正常工作:

import matplotlib.pyplot as plt

plt.plot(range(100000), '.')
plt.draw()

ax = plt.gca()
lblx = ax.get_xticklabels()
lblx[1]._text = 'hello!'
ax.set_xticklabels(lblx)
plt.draw()
plt.show()

我得到下图:
python - Matplotlib需要谨慎的时机吗? (或者是否有标记显示绘图已完成?)-LMLPHP

我想这是因为调用get_xticklabels()时没有自动创建xticklabel的时间。实际上,通过添加plt.pause(1)
import matplotlib.pyplot as plt

plt.plot(range(100000), '.')
plt.draw()
plt.pause(1)

ax = plt.gca()
lblx = ax.get_xticklabels()
lblx[1]._text = 'hello!'
ax.set_xticklabels(lblx)
plt.draw()
plt.show()

会给预期的

python - Matplotlib需要谨慎的时机吗? (或者是否有标记显示绘图已完成?)-LMLPHP

我对这种状态不太满意(必须手动插入延迟)。我主要关心的是:我怎么知道我需要等待多少时间?当然,这取决于图形元素的数量,机器强度等。

所以我的问题是:是否有一些标志可以知道matplotlib已完成绘制所有元素?还是有更好的方法来做我正在做的事情?

最佳答案

首先要注意的是,您可以任意停顿一下

plt.pause(1e-18)

这里的问题是plt.draw()调用plt.gcf().canvas.draw_idle()。这意味着该图形是在有时间的时候在任意点绘制的,因此是_idle

相反,您可能希望在所需代码的特定位置绘制图形。
plt.gcf().canvas.draw()

完整代码:
import matplotlib.pyplot as plt

plt.plot(range(100000), '.')
plt.gcf().canvas.draw()

ax = plt.gca()
lblx = ax.get_xticklabels()
lblx[1]._text = 'hello!'
ax.set_xticklabels(lblx)

plt.show()

关于python - Matplotlib需要谨慎的时机吗? (或者是否有标记显示绘图已完成?),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48865396/

10-16 01:33