在matplotlib对象上使用hashlib

问题描述

我正在使用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()