我想将方程式渲染为PNG文件,并将它们嵌入到我的库的HTML文档中。我已经在其他项目中使用了pylab(matplotlib)。
我在http://matplotlib.sourceforge.net/users/usetex.html和http://matplotlib.sourceforge.net/users/mathtext.html
中找不到任何线索当我这样做时
plt.title(r'$\alpha > \beta$')
plt.show()
我得到一个带轴的空标题。
更新
经过一些研究后我发现,将LaTeX渲染到png的最简单方法是使用mathext(http://code.google.com/p/mathtex/)。
令人惊讶的是,我已经将所有需要的库从源代码中构建出来。
无论如何,感谢大家的回复。
更新2:
我做了一些mathtex的测试,发现它不支持矩阵(\ begin {pmatrix})和其他一些我需要的东西。 所以,我打算安装LaTex(MikTeX)。
更新3:
我安装了proTeXt。这是巨大的,但易于使用和快速。恕我直言,现在它是渲染方程式的唯一方法。
答案 0 :(得分:6)
这对我有用:
# https://gist.github.com/tonyseek/95c90638cf43a87e723b
from cStringIO import StringIO
import matplotlib.pyplot as plt
def render_latex(formula, fontsize=12, dpi=300, format_='svg'):
"""Renders LaTeX formula into image.
"""
fig = plt.figure(figsize=(0.01, 0.01))
fig.text(0, 0, u'${}$'.format(formula), fontsize=fontsize)
buffer_ = StringIO()
fig.savefig(buffer_, dpi=dpi, transparent=True, format=format_, bbox_inches='tight', pad_inches=0.0)
plt.close(fig)
return buffer_.getvalue()
if __name__ == '__main__':
image_bytes = render_latex(
r'\theta=\theta+C(1+\theta-\beta)\sqrt{1-\theta}succ_mul',
fontsize=10, dpi=200, format_='png')
with open('formula.png', 'wb') as image_file:
image_file.write(image_bytes)
答案 1 :(得分:2)
(source)如果您正在使用IPython解释器,它会默认将所有单个matplotlib步骤渲染到一个数字窗口中。
因此,IPython中的plt.title(r'$\alpha > \beta$')
甚至会在调用.show()之前立即创建一个数字。另一方面,使用terminal / cmd / IDLE不会。
plt.show()
都会创建一个数字窗口,您希望将该行更改为:
plt.savefig('filename.png')
编辑: 好的,我误解了你的问题。正如@ Li-aung Yip所说,你可能想用Sympy来获得纯方程图像。我们仍然可以在matplotlib中做一些技巧来实现你想要的东西(你可能需要重新调整或相应调整大小):
import matplotlib.pyplot as plt
#add text
plt.text(0.01, 0.8, r'$\alpha > \beta$',fontsize=50)
#hide axes
fig = plt.gca()
fig.axes.get_xaxis().set_visible(False)
fig.axes.get_yaxis().set_visible(False)
plt.draw() #or savefig
这是通过隐藏轴刻度并在绘图中添加文本来完成的。
但是......这并不是真的“没有画出”一个数字:\虽然你可以进行后期处理,比如用PIL裁剪图像。
答案 2 :(得分:2)
听起来你想要render LaTeX equations to images。请参阅链接问题,了解以最少的依赖关系执行此操作的各种方法。 (有些人甚至涉及matplotlib
,我相信。)
或者,如果您可以安装LaTeX或依赖于正在安装的LaTeX,您可以使用LaTeX本身将方程式渲染为postscript,然后将其渲染为图像格式。
答案 3 :(得分:0)
我在Python 3中长时间使用@ warvariuc的答案,并提出了以下解决方案。它非常相似,但有一些关键的区别。首先,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)。