Matplotlib 图形图像转 base64
Posted
技术标签:
【中文标题】Matplotlib 图形图像转 base64【英文标题】:Matplotlib graphic image to base64 【发布时间】:2016-10-29 21:34:30 【问题描述】:问题:需要将matplotlib的图形图像转换为base64图像
当前解决方案:将matplot图像保存在缓存文件夹中,用read()方法读取,然后转换为base64
新问题:烦恼:需要一种解决方法,所以我不需要将图形保存为任何文件夹中的图像。我只想使用内存中的图像。进行不必要的 I/O 是一种不好的做法。
def save_single_graphic_data(data, y_label="Loss", x_label="Epochs", save_as="data.png"):
total_epochs = len(data)
plt.figure()
plt.clf()
plt.plot(total_epochs, data)
ax = plt.gca()
ax.ticklabel_format(useOffset=False)
plt.ylabel(y_label)
plt.xlabel(x_label)
if save_as is not None:
plt.savefig(save_as)
plt.savefig("cache/cached1.png")
cached_img = open("cache/cached1.png")
cached_img_b64 = base64.b64encode(cached_img.read())
os.remove("cache/cached1.png")
return cached_img_b64
【问题讨论】:
【参考方案1】:import cStringIO
my_stringIObytes = cStringIO.StringIO()
plt.savefig(my_stringIObytes, format='jpg')
my_stringIObytes.seek(0)
my_base64_jpgData = base64.b64encode(my_stringIObytes.read())
[edit]在python3中应该是
import io
my_stringIObytes = io.BytesIO()
plt.savefig(my_stringIObytes, format='jpg')
my_stringIObytes.seek(0)
my_base64_jpgData = base64.b64encode(my_stringIObytes.read())
我认为至少...基于文档http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.savefig
【讨论】:
如果您使用的是 Python 3 或更高版本,则需要使用 @nobar 在***.com/a/18284900/1802726 中提到的io.BytesIO
。
或者为了 Python 2/3 与最快实现的兼容性:try: from cStringIO import StringIO; except ImportError: from six import StringIO
(six
ref)【参考方案2】:
我无法得到以上工作的答案,但这样做了:
import io
import base64
s = io.BytesIO()
plt.plot(list(range(100)))
plt.savefig(s, format='png', bbox_inches="tight")
plt.close()
s = base64.b64encode(s.getvalue()).decode("utf-8").replace("\n", "")
return '<img align="left" src="data:image/png;base64,%s">' % s
【讨论】:
这是最快的解决方案吗?【参考方案3】:对于python 3
import base64
import io
pic_IObytes = io.BytesIO()
plt.savefig(pic_IObytes, format='png')
pic_IObytes.seek(0)
pic_hash = base64.b64encode(pic_IObytes.read())
原因是cStringIO
和cStringIO.StringIO()
都已弃用
【讨论】:
您可能需要添加更详细的说明 @YuliaV 我的意思是,在 Python 3 中,cStringIO
模块已被弃用以代替 io
模块。所以这就是我在回答中使用 io 模块的原因。以上是关于Matplotlib 图形图像转 base64的主要内容,如果未能解决你的问题,请参考以下文章
Matplotlib:从远程服务器获取base64图像[重复]
python matplotlib模块——绘制三维图形三维数据散点图(转)
Python可视化必备,在Matplotlib/Seaborn中轻松玩转图形拼接!