Визуализация уравнения в файл .png с использованием Python - PullRequest
5 голосов
/ 22 марта 2012

Я хочу отобразить уравнения в файлы 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. Это огромный, но простой в использовании и быстрый. ИМХО, пока это единственный способ рендеринга уравнений.

Ответы [ 4 ]

6 голосов
/ 12 июля 2015

Это сработало для меня:

# 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)
2 голосов
/ 22 марта 2012

Звучит так, как будто вы хотите визуализировать уравнения LaTeX для изображений .Смотрите связанный вопрос для различных способов сделать это с минимальными зависимостями.(Некоторые даже включают matplotlib, я полагаю.)

В качестве альтернативы, если вы можете установить LaTeX или полагаться на устанавливаемый LaTeX, вы можете просто использовать сам LaTeX для преобразования уравнения в postscript, а затем в формат изображения..

2 голосов
/ 22 марта 2012
  • ( source ) Если вы используете интерпретатор IPython, он по умолчанию отображает весь шаг matplotlib в окно рисунка.

    Таким образом, plt.title(r'$\alpha > \beta$') в IPython немедленно создаст фигуру еще до вызова .show (). С другой стороны, использование терминала / cmd / IDLE не будет.

  • plt.show() создаст окно рисунка независимо от того, используете вы IPython или нет, вы хотите изменить эту строку на:

    plt.savefig('filename.png')
    

Edit: Хорошо, я неправильно понял ваш вопрос. Как сказал @ 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.

0 голосов
/ 03 марта 2016

Я долго возился с ответом @ 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...