2

Pythonライブラリmatplotlibを使用して、この質問の解決策となるものを見つけました。matplotlibsTeXマークアップを利用
してPyQtで代数式を(うまく)表示します。

私がやりたいのは、数式を表すPythonプログラムからTeXコードを取得し、方程式を醜いプレーンテキストで表示するのではなく、PyQtGUIで表示できる画像に保存することです。

本質的にこのようなもの...

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

秘訣は、テキストをレンダリングしてからその境界ボックスを取得し、最後に図のサイズと新しい図のテキストの垂直位置を調整することです。これにより、図が2回保存されますが、他のテキストエンジンで一般的であるように、正しいバウンディングボックスやその他のパラメータは、テキストがレンダリングされた後でのみ正しく取得できます。

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たのheightは、明らかに、特定のテキストに対して、Matplotlibがわずかに過小評価されたバウンディングボックスを返しているためです。つまり、必要なサイズよりも小さいためです。

于 2013-01-04T18:54:26.057 に答える
0

Figure 内のテキストは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 のように質問を満たしません。

于 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() 関数の最初の 2 つの引数は、テキストの位置を設定します (0 と 1 の間なので、どちらも 0.5 でテキストが中央に配置されます)。

rc パラメータを設定することで、フォントやテキスト サイズなど、あらゆる種類のものを変更できます。http://matplotlib.org/users/customizing.htmlを参照してください。Figure サイズの rc パラメータを編集しましたが、デフォルトを変更できるので、毎回これを行う必要はありません。

于 2013-01-04T17:13:50.417 に答える