matplotlib保存图像时,使用bbox_inches='tight'参数设置图像大小。

27

我需要制作一个矢量图,并且希望只看到矢量而没有坐标轴、标题等其他元素,这是我尝试实现的方式:

pyplot.figure(None, figsize=(10, 16), dpi=100)
pyplot.quiver(data['x'], data['y'], data['u'], data['v'], 
              pivot='tail', 
              units='dots', 
              scale=0.2,
              color='black')

pyplot.autoscale(tight=True)
pyplot.axis('off')
ax = pyplot.gca()
ax.xaxis.set_major_locator(pylab.NullLocator())
ax.yaxis.set_major_locator(pylab.NullLocator())
pyplot.savefig("test.png", 
               bbox_inches='tight', 
               transparent=True,
               pad_inches=0)

尽管我努力想让图像大小为1000 x 1600,但最终得到的只有775 x 1280。如何使其达到期望的尺寸呢?谢谢。

更新:所提供的解决方案有效,但在我的情况下,我还必须手动设置轴限制。否则,matplotlib无法找到“紧密”的边界框。


2
使用MPL时,您必须清楚两个DPI值。一个是在创建“figure”对象时指定的用于屏幕上图形的交互显示的值。另一个DPI值适用于保存文件(无论以何种格式保存),它是在调用“savefig”时指定的。这就是为什么@unutbu发布的解决方案可行的原因。 - Paul H
1个回答

24
import matplotlib.pyplot as plt
import numpy as np

sin, cos = np.sin, np.cos

fig = plt.figure(frameon = False)
fig.set_size_inches(5, 8)
ax = plt.Axes(fig, [0., 0., 1., 1.], )
ax.set_axis_off()
fig.add_axes(ax)

x = np.linspace(-4, 4, 20)
y = np.linspace(-4, 4, 20)
X, Y = np.meshgrid(x, y)
deg = np.arctan(Y**3-3*Y-X)
plt.quiver(X, Y, cos(deg), sin(deg), pivot='tail', units='dots', color='red')
plt.savefig('/tmp/test.png', dpi=200)

产生

在此输入图片描述

通过将图形设置为5x8英寸,您可以使结果图像的大小为1000x1600像素。

fig.set_size_inches(5, 8)

使用DPI=200保存:

plt.savefig('/tmp/test.png', dpi=200)

这里提供了一个用于去除边框的代码,源自此处

(上面发布的图片并非按比例缩放,因为1000x1600实在是太大了)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接