获取matplotlib绘图的高度和宽度时的竞赛条件

获取matplotlib绘图的高度和宽度时的竞赛条件,matplotlib,Matplotlib,我不确定我是否遗漏了什么,或者这个竞争条件是否是matplotlib中的一个bug。我多次打印Axis对象的高度和宽度,下面的测试3和测试4之间有一个奇怪的差异,它们都在plt.show()调用之后,但是测试3紧跟在plt.show()之后,测试4紧跟在plt.pause(1)之后。这些(我想?)应该给出相同的结果,但是没有 Windows 10/Python 3.7.6/Matplotlib 3.1.3 import matplotlib.pyplot as plt f1,ax1 = plt

我不确定我是否遗漏了什么,或者这个竞争条件是否是matplotlib中的一个bug。我多次打印Axis对象的高度和宽度,下面的测试3和测试4之间有一个奇怪的差异,它们都在plt.show()调用之后,但是测试3紧跟在plt.show()之后,测试4紧跟在plt.pause(1)之后。这些(我想?)应该给出相同的结果,但是没有

Windows 10/Python 3.7.6/Matplotlib 3.1.3

import matplotlib.pyplot as plt

f1,ax1 = plt.subplots()

ax1.set_xlim(-1,1)
ax1.set_ylim(-1,1)

ax1.set_aspect('equal',adjustable='box')

h = ax1.bbox.height
w = ax1.bbox.width

####Test 1
print('%i,%i' % (h,w))


ax1.scatter([0,0.5],[0,0],marker='s',edgecolor='k',alpha=0.5)

h = ax1.bbox.height
w = ax1.bbox.width

####Test 2
print('%i,%i' % (h,w))


f1.show()

h = ax1.bbox.height
w = ax1.bbox.width

####Test 3
print('%i,%i' % (h,w)) #=> 369, 496

plt.pause(1) #Highlighting race condition

h = ax1.bbox.height
w = ax1.bbox.width

####Test 4
print('%i,%i' % (h,w)) #=> 368, 368

您正在使用哪个后端?你是否考虑升级MatPultLB?我认为这是所有MatMattLIB版本的正确和预期的行为。我认为产生混淆是因为您认为
f1.show
不仅应该显示图形,而且还应该在执行时强制在该点绘制图形(我完全可以理解),从而触发对bbox的调整。但是,在执行
plt.pause
命令之前,不会实际绘制图形。您可以用
f1.canvas.draw()
替换
f1.show()
命令来测试这一点
figure.canvas.draw
会强制绘制,然后最后两条打印语句匹配。IIRC、matplotlib仅在控件返回给用户时(即在脚本末尾)或在
plt.pause()命令之前强制绘制。