我正在尝试使用matplotlib
和cv2
制作切线的交互式图表。之前,我只是将文件保存到我的磁盘,然后将图像作为.png
打开到图像列表中。我决定省略使用磁盘并使用cStringIO
缓冲区。我现在已经省略了图像显示循环,因为我很确定它会在我通过它时起作用。我有两个函数,pic()
生成绘图,然后调用convt()
将绘图转换为缓冲区,并使用buff.getValue
提取原始字符串,然后返回字符串。问题似乎与np.frombuffer()
有关。如果我只是打印pic()
我可以将缓冲区视为字符串,但np.frombuffer(pic())
会导致ValueEerror
:
ValueError: buffer size must be a multiple of element size
以下是两个函数和注释掉的循环来填充列表。数学函数定义已被遗漏,因为我已经测试了它们并且它们按预期工作。请注意,此版本已最小化以导致相同的错误:
from matplotlib import pyplot as plt
import numpy as np
from cStringIO import StringIO
js= lambda t: 3*t #define function
ts=np.linspace(-3,3,100) #define domain
def convt(fig):
buff=StringIO() #instantiate StringIO object
fig.savefig(buff, format='png', dpi=fig.dpi) #print png to buffer
rawstring=buff.getvalue() #pull string from buffer
buff.close() #close buffer
return rawstring #return string
def pic(ts,js):
plt.plot(ts,js(ts)) #generate mpl plot
fig=plt.gcf() #grab current figure
out=convt(fig) #convert to string
plt.close() #close plot
return out #return string
np.frombuffer(rawstring) #causes ValueError, remove np.frombuffer()
#and you can see the string