Я долго возился с ответом @ warvariuc в Python 3 и придумал следующее решение. Это очень похоже, но имеет несколько ключевых отличий. Во-первых, StringIO
и cStringIO
не являются модулями в Py3. Во-вторых, эквивалентный класс io.StringIO
не работает хотя бы с некоторыми версиями MatPlotLib . Смотрите эту ветку: http://matplotlib.1069221.n5.nabble.com/savefig-and-StringIO-error-on-Python3-td44241.html. По сути, изображение является двоичным, поэтому вам нужно использовать io.BytesIO
. Метод getvalue()
работает так же, как и StringIO
. Я взял на себя смелость использовать savefig
для открытия файла, поскольку он может решить, передали ли вы имя файла или нет для него:
from io import BytesIO
import matplotlib.pyplot as plt
def renderLatex(formula, fontsize=12, dpi=300, format='svg', file=None):
"""Renders LaTeX formula into image or prints to file.
"""
fig = plt.figure(figsize=(0.01, 0.01))
fig.text(0, 0, u'${}$'.format(formula), fontsize=fontsize)
output = BytesIO() if file is None else file
with warnings.catch_warnings():
warnings.filterwarnings('ignore', category=MathTextWarning)
fig.savefig(output, dpi=dpi, transparent=True, format=format,
bbox_inches='tight', pad_inches=0.0, frameon=False)
plt.close(fig)
if file is None:
output.seek(0)
return output
Предупреждение было чем-то, что, я уверен, связано с размером фигуры. Вы можете удалить with
полностью, если хотите. Причина поиска заключается в том, чтобы сделать «файл» читаемым (лучше всего объяснить здесь: https://stackoverflow.com/a/8598881/2988730).