使用Python将方程式渲染为.png文件

时间:2012-03-22 07:48:52

标签: python matplotlib

我想将方程式渲染为PNG文件,并将它们嵌入到我的库的HTML文档中。我已经在其他项目中使用了pylab(matplotlib)。

我在http://matplotlib.sourceforge.net/users/usetex.htmlhttp://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。这是巨大的,但易于使用和快速。恕我直言,现在它是渲染方程式的唯一方法。

4 个答案:

答案 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不会。

  • 无论您是否正在使用IPython,
  • 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的答案,并提出了以下解决方案。它非常相似,但有一些关键的区别。首先,StringIOcStringIO不是Py3中的模块。其次,等效类io.StringIO 不适用于至少某些版本的MatPlotLib 。请参阅此主题:http://matplotlib.1069221.n5.nabble.com/savefig-and-StringIO-error-on-Python3-td44241.html。基本上,图像是二进制的,因此您需要使用io.BytesIOgetvalue()方法与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)。