2013-01-01 26 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那样满足问题。