2012-03-22 24 views
5

Tôi muốn hiển thị phương trình cho tệp PNG và nhúng chúng vào tài liệu HTML của thư viện của tôi. Tôi đã sử dụng pylab (matplotlib) trong các dự án khác.Hiển thị phương trình thành tệp .png bằng cách sử dụng Python

tôi đã không tìm thấy bất kỳ manh mối trong http://matplotlib.sourceforge.net/users/usetex.htmlhttp://matplotlib.sourceforge.net/users/mathtext.html

Khi tôi làm

plt.title(r'$\alpha > \beta$') 
plt.show() 

tôi nhận được một con số có sản phẩm nào có tựa đề với trục.

Cập nhật:

Sau khi thực hiện một số nghiên cứu tôi thấy, đó là cách dễ nhất của render LaTeX để png đang sử dụng mathext (http://code.google.com/p/mathtex/).

Đáng ngạc nhiên, tôi đã có tất cả thư viện được yêu cầu để xây dựng nó từ nguồn.

Dù sao, cảm ơn mọi người đã trả lời.

Cập nhật 2:

tôi đã làm một số thử nghiệm của mathtex và thấy nó không hỗ trợ các ma trận (\ begin {pmatrix}) và một số thứ khác tôi cần. Vì vậy, tôi sẽ cài đặt LaTex (MikTeX).

Cập nhật 3:

Tôi đã cài đặt proTeXt. Nó rất lớn, nhưng dễ sử dụng và nhanh chóng. IMHO, bây giờ nó là cách duy nhất để render phương trình.

+0

Bạn chỉ muốn lấy phương trình được hiển thị dưới dạng png hoặc có phải được thực hiện với matplotlib/trong một hình ảnh matplotlib không? –

+0

Bạn đã thấy http://matplotlib.org/users/usetex.html –

Trả lời

2
  • (source) Nếu bạn đang sử dụng IPython thông dịch, nó ám tất cả các bước matplotlib duy nhất vào một cửa sổ hình theo mặc định.

    Do đó, plt.title(r'$\alpha > \beta$') trong IPython sẽ tạo ngay một hình ngay cả trước khi gọi .show(). Mặt khác, sử dụng terminal/cmd/IDLE sẽ không.

  • plt.show() sẽ tạo ra một cửa sổ hình cho dù bạn đang sử dụng IPython hay không, bạn muốn thay đổi dòng để:

    plt.savefig('filename.png') 
    

Edit: Được rồi, tôi hiểu lầm câu hỏi của bạn. Như @ Li-aung Yip đã nói, bạn có thể muốn sử dụng Sympy cho hình ảnh phương trình thuần túy. Chúng tôi vẫn có thể làm một số trick trong matplotlib để đạt được những gì bạn muốn mặc dù (bạn có thể cần phải điều chỉnh hoặc thay đổi kích thước cho phù hợp):

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 

này được thực hiện bởi các trục ẩn bọ ve và thêm văn bản bên trong con số âm mưu.

Nhưng ... điều này không thực sự "không vẽ" một con số: \ Mặc dù bạn có thể sau quá trình như cắt hình ảnh với PIL.

+0

plt.savefig ('filename.png') tạo ra tệp có tiêu đề hình rỗng với các trục – peterdemin

+0

Thans cho câu trả lời của bạn. Giải pháp là quá khó khăn đối với tôi. – peterdemin

+2

Tôi nhận được '/usr/local/lib/python2.7/dist-packages/matplotlib/backends/backend_gtk3.py:215: Cảnh báo: ID nguồn 7 không được tìm thấy khi cố gắng xóa nó GLib.source_remove (self._idle_event_id) 'khi thực thi khối mã cuối cùng. –

2

Có vẻ như bạn muốn render LaTeX equations to images. Xem câu hỏi được liên kết để biết nhiều cách để làm điều này với phụ thuộc tối thiểu. (Một số thậm chí liên quan đến matplotlib, tôi tin.Cách khác, nếu bạn có thể cài đặt LaTeX hoặc dựa vào LaTeX đang được cài đặt, bạn chỉ có thể sử dụng LaTeX để hiển thị phương trình thành postscript và từ đó sang định dạng hình ảnh.

6

này đã làm việc cho tôi:

# 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) 
+0

Đây là câu trả lời cụ thể duy nhất tốt mà tôi đã thấy cho đến nay. Tất cả các dự án khác đề xuất hiện có vẻ đã chết hoặc chỉ ra các câu hỏi không có câu trả lời thực sự. –

0

Tôi fiddled với câu trả lời @ warvariuc của một thời gian dài bằng Python 3 và đã đưa ra các giải pháp sau đây. Nó rất giống nhưng có một vài điểm khác biệt chính. Đầu tiên, StringIOcStringIO không phải là mô-đun trong Py3. Thứ hai, lớp tương đương io.StringIOkhông hoạt động với ít nhất một số phiên bản của MatPlotLib. Xem chủ đề này: http://matplotlib.1069221.n5.nabble.com/savefig-and-StringIO-error-on-Python3-td44241.html. Về cơ bản, hình ảnh là nhị phân, vì vậy bạn cần sử dụng io.BytesIO. Phương thức getvalue() hoạt động giống như StringIO. Tôi mất sự tự do của việc sử dụng savefig để làm việc mở tập tin, vì nó có thể quyết định xem bạn thông qua trong một tên tập tin hay không cho chính nó:

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 

Cảnh báo là một cái gì đó mà tôi khá chắc chắn có liên quan đến con số kích thước. Bạn có thể xóa hoàn toàn with kèm theo nếu muốn. Lý do cho việc tìm kiếm là làm cho "tập tin" có thể đọc được (tốt nhất được giải thích ở đây: https://stackoverflow.com/a/8598881/2988730).

+0

Nó có hoạt động với ma trận không? – peterdemin

+0

Có, nhưng bạn phải fiddle với các thiết lập. Xem tại đây: http://stackoverflow.com/a/26331197/2988730 –

Các vấn đề liên quan