【问题标题】:Creating images of mathematical expressions from TeX, using matplotlib使用 matplotlib 从 TeX 创建数学表达式的图像
【发布时间】:2013-01-01 13:04:31
【问题描述】:

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

请注意,这显示的是空白图像;查看显示屏左侧
Fraction at coordinate (0,0) truncated and surrounded by whitespace

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

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

谢谢!

【问题讨论】:

  • 你需要使用matplotlib吗?也许这很有趣:stackoverflow.com/questions/617668/…
  • 该页面上的链接已损坏
  • 我找到了该实用程序; SVG数学。这需要在用户机器上安装,我发现即使对于那个问题(提到独立性),它也是一个糟糕的解决方案。我可以用我的代码编译和捆绑 matplotlib。

标签: python image matplotlib equation tex


【解决方案1】:

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

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 会返回一个略微低估的边界框,即小于所需的值。

【讨论】:

  • 我希望有一个渲染方法,或者少一些 - 似乎完全没有必要:(
  • 如果您愿意(我不喜欢),您可以致电 pylab.show(block=False)
【解决方案2】:

可以使用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 那样满足问题。

【讨论】:

    【解决方案3】:

    怎么样

    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 参数,但您可以更改默认值,因此您不必每次都这样做。

    【讨论】:

    • 但是如何去除 TeX 周围的空白?如何修剪图像?
    • rc参数更新,设置图形大小。 [2,2] 在我的例子中。
    • ...你怎么知道要制作什么尺寸的?
    猜你喜欢
    • 2018-11-09
    • 1970-01-01
    • 2022-08-02
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    相关资源
    最近更新 更多