问题描述
我正在使用Python,尝试编写将当前输出与预期输出进行比较的测试。输出是一个matplotlib图形,我想这样做而不将图形保存到文件中。
我的想法是找到对象的加密哈希,这样我只需要将一个哈希与另一个哈希进行比较,以确认整个对象与预期的一样。
这对于如下的numpy数组工作正常:
import numpy as np
import hashlib
np.random.seed(1)
A = np.random.rand(10,100)
actual_hash = hashlib.sha1(A).hexdigest()
expected_hash = '38f682cab1f0bfefb84cdd6b112b7d10cde6147f'
assert actual_hash == expected_hash
当我在matplotlib对象上尝试此操作时,我得到:TypeError: object supporting the buffer API required
import hashlib
import numpy as np
import matplotlib.pyplot as plt
X = np.linspace(0,100,1000)
Y = np.sin(0.5*X)
plt.plot(X,Y)
fig = plt.gcf()
actual_hash = hashlib.sha1(fig).hexdigest() #this raises the TypeError
有什么想法可以使用hashlib查找matplotlib对象的加密哈希?
谢谢。
解决方法
您可以使用buffer_rgba()
将图形作为numpy数组。在使用它之前,您必须先绘制图形:
draw必须至少调用一次,然后此函数才能起作用,并且 更新渲染器以进行对图形的任何后续更改。
import hashlib
import numpy as np
import matplotlib.pyplot as plt
X = np.linspace(0,100,1000)
Y = np.sin(0.5*X)
plt.plot(X,Y)
canvas = plt.gcf().canvas
canvas.draw()
actual_hash = hashlib.sha1(np.array(canvas.buffer_rgba())).hexdigest()