2013-01-01 61 views
1

使用Python庫matplotlib,我發現有什麼建議要對這一問題的解決方案:
Displaying (nicely) an algebraic expression in PyQt利用matplotlibs TeX markup創建從TeX的數學表達式的圖像,使用matplotlib

我想要做的就是從我的python程序中取出表示數學表達式的TeX代碼,並將它保存到可以在我的PyQt GUI中顯示的圖像,而不是以醜陋的純文本顯示公式。

像這樣的東西基本上是...

import matplotlib.pyplot as plt 
formula = '$x=3^2$' 

fig = plt.figure() 
fig.text(0,0,formula) 
fig.savefig('formula.png') 

然而,pyplot模塊主要是爲像我需要顯示文本的圖表和曲線,而不是樣品。該代碼的結果通常是巨大的白色空白圖像左下角的一小段文字。
如果我的公式涉及分數,因此需要向下空間,它將被截斷,如下圖所示。

請注意,這會顯示一個空白圖像;放眼顯示
Fraction at coordinate (0,0) truncated and surrounded by whitespace

我相信我可以創建一個非常大的(空間明智)圖的左側,寫在空白的情節中間的公式,保存,使用像素分析修剪它儘可能小的圖像,但這似乎相當粗糙。

這些圖是matplotlib的唯一預期輸出嗎?
有沒有什麼東西專門用於輸出方程式,那不需要我擔心文本的所有額外空間或位置?

謝謝!

+1

你需要使用matplotlib嗎?也許這是有趣的:http://stackoverflow.com/questions/617668/looking-for-a-self-contained-equation-rendering-library – Thomas

+0

該頁面上的鏈接被打破 –

+0

我發現該實用程序; SvgMath。 這需要在用戶機器上進行安裝,即使對於這個問題(它提到了獨立性),我發現它仍然是一個糟糕的解決方案。我可以用我的代碼編譯和捆綁matplotlib。 –

回答

6

訣竅是渲染文本,然後獲取邊界框,最後調整新圖中文本的圖形大小和垂直位置。這樣可以將圖保存兩次,但在任何文本引擎中都很常見,正確的邊界框和其他參數只有在文本被渲染後才能正確獲得。

import pylab 

formula = r'$x=3^2, y = \frac{1}{\frac{2}{3}}, %s$' % ('test' * 20) 

fig = pylab.figure() 
text = fig.text(0, 0, formula) 

# Saving the figure will render the text. 
dpi = 300 
fig.savefig('formula.png', dpi=dpi) 

# Now we can work with text's bounding box. 
bbox = text.get_window_extent() 
width, height = bbox.size/float(dpi) + 0.005 
# Adjust the figure size so it can hold the entire text. 
fig.set_size_inches((width, height)) 

# Adjust text's vertical position. 
dy = (bbox.ymin/float(dpi))/height 
text.set_position((0, -dy)) 

# Save the adjusted text. 
fig.savefig('formula.png', dpi=dpi) 

0.005常數加入到widthheight因爲,很顯然,對於某些文本Matplotlib返回一個略微低估邊界框,即,比要求的要小。

+0

我希望有一個渲染方法,或者少一點東西 - 看起來完全沒有必要:( –

+1

)您可以調用'pylab.show(block = False)'而不是,如果您願意(我不)。 – mmgp

-1

怎麼樣

import matplotlib.pyplot as plt 

params = { 
     'figure.figsize': [2,2], 
    } 
plt.rcParams.update(params) 

formula = r'$x=\frac{3}{100}$' 

fig = plt.figure() 
fig.text(0.5,0.5,formula) 

plt.savefig('formula.png') 

,前兩個是matplotlib文本的參數()函數來設置(在0 & 1,所以0.5兩種獲取中間文本。)

文本的位置

您可以通過設置rc參數來更改各種類型的內容,如字體和文本大小。見http://matplotlib.org/users/customizing.html。我已經編輯了數字大小的rc參數,但是您可以更改默認值,因此您不必每次都這樣做。

+0

但是你如何擺脫TeX周圍的空白?如何修剪圖像? –

+0

rc參數更新,設置圖形大小。以我的例子中的[2,2]爲例。 – Victoria

+0

...你怎麼知道什麼數字大小? –

0

可以使用figure.suptitle正確放置圖中的文本,並指定明智的對齊方式,以便文本位於左上角並向下並向右(相對於指定的x和y座標)運行。

fig = plt.Figure() 
fig.suptitle('TeX', 
      horizontalalignment = 'left', 
      verticalalignment='top', 
      x=0.01, y = 0.99) 

可以包裹在Qt物件,FigureCanvasQTAgg到在程序中顯示的。

canvas = FigureCanvasQTAgg(fig) #Treated as QWidget 
canvas.draw() 

然而,帆布和數字仍然沒有文字的大小的知識,所以仍然可以過大而造成的空白,或過小而導致截斷。這對我的程序來說很好,但不像mmgp那樣滿足問題。