从 matplotlib 绘图中删除填充

19

我正在使用matplotlib绘制图像,但它一直给我一些填充。这是我尝试过的:

def field_plot():
    x = [i[0] for i in path]
    y = [i[1] for i in path]
    plt.clf()
    plt.axis([0, 560, 0, 820])
    im = plt.imread('field.jpg')
    field = plt.imshow(im)
    for i in range(len(r)):
        plt.plot(r[i][0],r[i][1],c=(rgb_number(speeds[i]),0,1-rgb_number(speeds[i])),linewidth=1)
    plt.axis('off')
    plt.savefig( IMG_DIR + 'match.png',bbox_inches='tight', transparent="True")
    plt.clf()

这是我看到这张图片的样子


你所指的填充是在图像的哪个位置?此外,你的示例并不是很有用,因为没有你的图像文件我们无法运行它。 - BrenBarn
@BrenBarn 在图像的左侧和下方是最大的填充。在上方和右侧我有较小的填充。就好像留出空间放标签一样。 - andresmechali
1
你能提供一个可运行的示例,而不依赖外部文件吗?此外,请参见先前的问题[此处](https://dev59.com/0HA75IYBdhLWcg3wv7wj)和[此处](https://dev59.com/Xmox5IYBdhLWcg3wTina)。如果这些方法无效,请解释一下它们不能做到你需要的功能是什么。 - BrenBarn
@BrenBarn 我非常新手,所以我不知道如何为此提供更好的示例.. 很抱歉,我不知道如何在没有图像的情况下思考它.. :( - andresmechali
你介意附上图片让我们看看你在说什么吗?另外,也许你的代码应该更完整一些(例如,我不知道r是什么,除了猜测)。 - tshepang
1
@Tshepang 我已经附上了保存的图像。如果您下载它,您会发现它有很大的白色填充区域。 r是一个列表,其中包含每个点的[x,x+1],[y,y+1](每个绘图的坐标)。 - andresmechali
5个回答

27

尝试使用 pad_inches=0,即:

plt.savefig( IMG_DIR + 'match.png',bbox_inches='tight', transparent="True", pad_inches=0)

文档中得知:

pad_inches:当bbox_inches为‘tight’时,图形周围的填充量。

我认为默认值是pad_inches=0.1


4
True周围不需要引号;transparent=True。原因是transparent="False"也会转换为transparent=True。 - nvd

8
只需在 plt.savefig() 之前添加 plt.tight_layout()!!
plt.figure(figsize=(16, 10))

# ... Doing Something ...

plt.tight_layout()
plt.savefig('wethers.png')
plt.show()

5

这对我有帮助。绘图后,使用ax = plt.gca()从plt获取Axes对象。然后将ax对象的xlim和ylim设置为匹配图像宽度和图像高度。Matplotlib似乎在绘制时自动增加可视区域的xlim和ylim。请注意,在设置y_lim时,必须反转坐标的顺序。

for i in range(len(r)):
  plt.plot(r[i][0],r[i][1],c=(rgb_number(speeds[i]),0,1-rgb_number(speeds[i])),linewidth=1)

plt.axis('off')
ax = plt.gca();
ax.set_xlim(0.0, width_of_im);
ax.set_ylim(height_of_im, 0.0);
plt.savefig( IMG_DIR + 'match.png',bbox_inches='tight', transparent="True")

3

之前的方法对我来说都不太适用,因为它们都会在图像周围留下一些空白。

接下来的几行代码成功地移除了留下的白色或透明填充:

plt.axis('off')
ax = plt.gca()
ax.xaxis.set_major_locator(matplotlib.ticker.NullLocator())
ax.yaxis.set_major_locator(matplotlib.ticker.NullLocator())
plt.savefig(IMG_DIR + 'match.png', pad_inches=0, bbox_inches='tight', transparent=True)

3
使用plt.gca().set_position((0, 0, 1, 1))使轴覆盖整个图像,参见参考资料。 如果使用plt.imshow函数,则需要确保图像具有正确的宽高比。
import matplotlib as mpl
import matplotlib.pyplot as plt

# set the correct aspect ratio
dpi = mpl.rcParams["figure.dpi"]
plt.figure(figsize=(560/dpi, 820/dpi))

plt.axis('off')
plt.gca().set_position((0, 0, 1, 1))

im = plt.imread('field.jpg')
plt.imshow(im)

plt.savefig("test.png")
plt.close()

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