Python Matplotlib仅保存不带空格的文本

Python Matplotlib仅保存不带空格的文本,python,matplotlib,sympy,Python,Matplotlib,Sympy,因此,在python中,我有以下代码,摘自: 这将打开文本并将其导出为png文件: 但这包括帧外空白之外的空白。如何裁剪图像以仅导出文本,如边界框,如下图所示 以下不是一个完美的解决方案,但它有望为您提供一些关于如何进步的想法: import matplotlib.pyplot as plt import sympy x = sympy.symbols('x') y = 1 + sympy.sin(sympy.sqrt(x**2 + 2)) lat = sympy.latex(y) fig

因此,在python中,我有以下代码,摘自:

这将打开文本并将其导出为png文件:

但这包括帧外空白之外的空白。如何裁剪图像以仅导出文本,如边界框,如下图所示


以下不是一个完美的解决方案,但它有望为您提供一些关于如何进步的想法:

import matplotlib.pyplot as plt
import sympy

x = sympy.symbols('x')
y = 1 + sympy.sin(sympy.sqrt(x**2 + 2))
lat = sympy.latex(y)

fig = plt.figure()
renderer = fig.canvas.get_renderer()
t = plt.text(0.001, 0.001, f"${lat}$", fontsize=50)
wext = t.get_window_extent(renderer=renderer)

fig.set_size_inches(wext.width / 65, wext.height / 40, forward=True)
fig.patch.set_facecolor('white')
plt.axis('off')
plt.tight_layout()
plt.savefig('out.png', bbox_inches='tight', pad_inches=0)
plt.show()
其思想是,您可以通过使用当前渲染器获取窗口范围来确定文本的大小。然后还可以手动指定地物大小。但我不确定在两者之间转换的正确方法。注意,我在图像中添加了边框,以便您可以看到剩余的填充量:


作为解决此问题的一种方法,以下方法仅使用Python的PIL库在保存图像之前自动裁剪图像:

import io
from PIL import Image, ImageOps
import matplotlib.pyplot as plt
import sympy

x = sympy.symbols('x')
y = 5 /sympy.sqrt(1 + sympy.sin(sympy.sqrt(x**2 + 2))) 
lat = sympy.latex(y)

fig = plt.figure()
t = plt.text(0.001, 0.001, f"${lat}$", fontsize=50)

fig.patch.set_facecolor('white')
plt.axis('off')
plt.tight_layout()

with io.BytesIO() as png_buf:
    plt.savefig(png_buf, bbox_inches='tight', pad_inches=0)
    png_buf.seek(0)
    image = Image.open(png_buf)
    image.load()
    inverted_image = ImageOps.invert(image.convert("RGB"))
    cropped = image.crop(inverted_image.getbbox())
    cropped.save('out.png')
裁剪后的版本如下所示:


嗯。。。看起来它可以工作,但似乎无法在OSX上获得当前渲染器,即使使用answer提供的解决方案也是如此。有什么想法吗?再次感谢。好的,解决了它,在OSX上,如果你正在使用解决方案,用
fig.canvas.print\u pdf(io.BytesIO())
替换为
fig.canvas.print\u figure(“out.png”)
获得渲染器,使用相同的文件名再次保存以覆盖它。我不明白为什么会有
65
40
,有人能解释吗?不幸的是,这就是为什么它不是一个完美的解决方案。从
get\u window\u extent
返回的值需要与
set\u size\u inches
相关<代码>65和
40
为假值。如果使用“更深”或“更宽”的公式,则可能需要进一步调整值。您可以使用Symphy的
预览(expr,viewer='file',filename='output.png')
函数生成LaTeX。
import io
from PIL import Image, ImageOps
import matplotlib.pyplot as plt
import sympy

x = sympy.symbols('x')
y = 5 /sympy.sqrt(1 + sympy.sin(sympy.sqrt(x**2 + 2))) 
lat = sympy.latex(y)

fig = plt.figure()
t = plt.text(0.001, 0.001, f"${lat}$", fontsize=50)

fig.patch.set_facecolor('white')
plt.axis('off')
plt.tight_layout()

with io.BytesIO() as png_buf:
    plt.savefig(png_buf, bbox_inches='tight', pad_inches=0)
    png_buf.seek(0)
    image = Image.open(png_buf)
    image.load()
    inverted_image = ImageOps.invert(image.convert("RGB"))
    cropped = image.crop(inverted_image.getbbox())
    cropped.save('out.png')