使用plt.savefig()和cStringIO缓冲区的ValueError

时间:2017-08-23 22:10:56

标签: python numpy matplotlib cstringio

我正在尝试使用matplotlibcv2制作切线的交互式图表。之前,我只是将文件保存到我的磁盘,然后将图像作为.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

0 个答案:

没有答案