2

使用 python 库 matplotlib,我找到了建议解决这个问题的方法:
Displaying (nicely) an algebraic expression in PyQt by using matplotlibs TeX markup

我想做的是从我的 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 模块主要用于显示图形和绘图,而不是像我需要的文本样本。该代码的结果通常是一个巨大的白色空白图像左下角的一小段文本。
如果我的公式涉及分数,因此需要向下空间,它会被截断,如下图所示。

请注意,这显示为空白图像;查看显示的左侧
坐标 (0,0) 处的分数被截断并被空格包围

我相信我可以创建一个非常大(空间明智)的图形,在空白图的中间写下公式,保存它,然后使用像素分析将其修剪为尽可能小的图像,但这似乎相当粗糙。

绘图是 matplotlib 的唯一预期输出吗?
有没有专门用于输出方程的东西,不需要我担心文本的所有额外空间或位置?

谢谢!

4

3 回答 3

8

诀窍是渲染文本,然后获取它的边界框,最后调整图形大小和文本在新图形中的垂直位置。这将图形保存了两次,但在任何文本引擎中都很常见,只有在文本渲染后才能正确获得正确的边界框和其他参数。

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常数被添加到width并且因为,显然,对于某些文本,heightMatplotlib 返回一个略微低估的边界框,即小于所需的值。

于 2013-01-04T18:54:26.057 回答
0

可以使用和指定合理的对齐方式正确放置图中figure.suptitle的文本,以便文本位于左上角并向下和向右延伸(相对于指定的 x 和 y 坐标)。

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

它可以包装在一个 Qt Widget 中,FigureCanvasQTAgg以在程序中显示。

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

但是,画布和图形仍然不知道文本的大小,因此仍然可能太大而导致空白,或者太小而导致截断。这对我的程序来说很好,但不像 mmgp 那样满足问题。

于 2013-01-05T04:18:31.237 回答
-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 text() 函数的前两个参数设置文本的位置(介于 0 和 1 之间,因此两者的 0.5 使您的文本位于中间。)

您可以通过设置 rc 参数来更改字体和文本大小等各种内容。请参阅http://matplotlib.org/users/customizing.html。我已经编辑了图形大小的 rc 参数,但是您可以更改默认值,因此您不必每次都这样做。

于 2013-01-04T17:13:50.417 回答