scipy:savefig,不包括框架,轴,仅内容


92

在numpy / scipy中,我将图像存储在数组中。我可以显示它,我想使用它来保存它,savefig 而没有任何边框,轴,标签,标题等。。。只是纯图像而已。

我想避免像PyPNG或那样的软件包scipy.misc.imsave,有时它们有问题(它们并不总是安装得很好,仅对savefig()我而言是基本的

Answers:


115

编辑

更改aspect='normal为,aspect='auto'因为在最新版本的matplotlib中该更改(由于@ Luke19)。


假设 :

import matplotlib.pyplot as plt

制作没有边框的图形:

fig = plt.figure(frameon=False)
fig.set_size_inches(w,h)

使内容填满整个数字

ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.set_axis_off()
fig.add_axes(ax)

然后在上面绘制图像:

ax.imshow(your_image, aspect='auto')
fig.savefig(fname, dpi)

aspect参数更改像素大小,以确保他们填写指定的数字大小fig.set_size_inches(…)。要了解如何玩这种东西,请通读matplotlib的文档,尤其是有关“轴,轴和艺术家”主题的文档


4
不,我还有一些小的透明边框,我想要的是根本没有边框,纯净的图像
Jakub M.

5
如果您手动将wh参数设置为和fig.set_size_inches(w,h)中将dpi参数设置为fig.savefig(fname, dpi)24px x 24px,则它应该可以正常工作。例如,w = h = 1dpi = 24
matehat 2011年

5
我必须将这个答案与Mostafa Pakparvar在下面的答案结合起来。您不仅需要关闭轴,还需要将set_visible设置为false以确保空白消失。(wtf?)
布莱斯·昆塔

6
刚刚使用matplotlib v2.2.2进行了尝试,效果很好(除非imshow的语法改为,aspect='auto'而不是'normal')。
路加福音

2
这是正确的方法。ax = plt.Axes(fig, [0., 0., 1., 1.])是什么使它起作用。
greatvovan

73

似乎更简单的解决方案是:

fig.savefig('out.png', bbox_inches='tight', pad_inches=0)

2
这对我来说很好。同样,pad_inches可以轻松更改为所需大小。谢谢!
Curious2learn

27
我仍然有这个空白。
法比奥·佩雷斯

3
我能够通过添加transparent = Truefig.savefig('out.png', bbox_inches='tight',transparent=True, pad_inches=0)
mdoc-2011

2
仍然有轴和刻度线以及其他所有信息:(
BjornW

3
这根本不做任何事情。它会为您提供带有所有轴和标签的图形。
1813e

27

您可以在轴内找到图片的bbox(使用get_window_extent),并使用bbox_inches参数仅保存图片的该部分:

import numpy as np
import matplotlib.pyplot as plt

data=np.arange(9).reshape((3,3))
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
plt.axis('off')
plt.imshow(data)

extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig('/tmp/test.png', bbox_inches=extent)

我从这里的乔·肯顿那里学到了这个技巧。


6
刚刚plt.axis('off')帮助。其他答案没有太大帮助。
imsrgadich

3
这工作得很好。但是,就我而言,仍然有一个小的白色边框。关于如何删除此边框的任何想法?
user3731622

@ user3731622,请尝试plt.savefig('/temp/test.png', bbox_inches='tight', transparent=True, pad_inches=0)代替plt.savefig('/tmp/test.png', bbox_inches=extent)
Cloud Cho

17

我已经尝试了几种方法,而最好的解决方案是:

fig.subplots_adjust(bottom = 0)
fig.subplots_adjust(top = 1)
fig.subplots_adjust(right = 1)
fig.subplots_adjust(left = 0)

然后用 savefig


1
在所有这些解决方案中,这是唯一对我有用的解决方案。
Puff

8

我将建议在heron13答案上加上一点点额外内容,以将bbox设置为紧模式后删除此处剩余的填充,因此:

axes = fig.axes()
axes.get_xaxis().set_visible(False)
axes.get_yaxis().set_visible(False)
fig.savefig('out.png', bbox_inches='tight', pad_inches=0)

我收到一条错误消息,说get_xaxis()和get_yaxis()不存在。知道为什么会这样吗?
Jacob Malachowski

创建一个axes()对象,然后使用ax.xaxis和ax.yaxis
Perigon

收到错误消息“列表”对象有没有属性“get_xaxis”
耗着谢

7

这个为我工作

plt.savefig('filename',bbox_inches='tight',transparent=True, pad_inches=0)

3

在使用librosa进行可视化时,我遇到了相同的问题,我想在没有任何其他信息的情况下提取图的内容。所以这是我的方法。unutbu的答案也可以帮助我工作。

    figure = plt.figure(figsize=(500, 600), dpi=1)
    axis = plt.subplot(1, 1, 1)
    plt.axis('off')
    plt.tick_params(axis='both', left='off', top='off', right='off', bottom='off', labelleft='off', labeltop='off',
                    labelright='off', labelbottom='off')

     # your code goes here. e.g: I used librosa function to draw a image
    result = np.array(clip.feature_list['fft'].get_logamplitude()[0:2])
    librosa.display.specshow(result, sr=api.Clip.RATE, x_axis='time', y_axis='mel', cmap='RdBu_r')


    extent = axis.get_window_extent().transformed(figure.dpi_scale_trans.inverted())
    plt.savefig((clip.filename + str("_.jpg")), format='jpg', bbox_inches=extent, pad_inches=0)
    plt.close()

这使我走上了正确的轨道,但是我遇到两个问题:1)为了避免jupyter笔记本出现字体错误,我必须将dpi设置为大于1的数字。和2)仍然有一个小边框,因此我必须手动将Bbox的范围更改为extent.get_points()*np.array([[1.1],[.9]])
鲍勃·巴克斯利

感谢您提供可能对其他人有帮助的答案。
GPrathap '17

3

对于尝试在Jupyter中执行此操作的任何人

 plt.axis('off')

 spec = plt.imshow

 plt.savefig('spec',bbox_inches='tight',transparent=True, pad_inches=0)

2

虽然以上答案解决了删除边距和填充的问题,但它们对我来说在删除标签上不起作用。对于后来偶然发现此问题的任何人,这都是有效的方法:

假设您希望从存储在images以下位置的四个图像中获得2x2的子图网格:

matplotlib.pyplot.figure(figsize = (16,12)) # or whatever image size you require
for i in range(4):
    ax = matplotlib.pyplot.subplot(2,2,i+1)
    ax.axis('off')
    imshow(images[i])
matplotlib.pyplot.savefig(path, bbox_inches='tight')

1

我也尝试使用此处的提示摆脱边界,但没有任何实际效果。经过一些摆弄,我发现在jupyter实验室中更换faceolor不会给我任何边界(任何颜色都会消除白色边界)。希望这可以帮助。

def show_num(data):
data = np.rot90(data.reshape((16,16)), k=3)
data = np.fliplr(data)
fig = plt.figure(frameon=False, facecolor='white')
ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.set_axis_off()
fig.add_axes(ax)
ax.imshow(data)
plt.show()

在此处输入图片说明



0

对我来说,此代码使输入图像的大小与matehatunutbuWHZW代码相似,但没有帧和轴:

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
plt.axis('off')
viridis = cm.get_cmap('gist_gray', 256)
plt.imshow(data, aspect='auto', cmap=viridis)
plt.tight_layout()
plt.savefig(out_file, bbox_inches='tight', transparent=True, pad_inches=0)

运行时环境:
Python 3.6.10
Matplotlib 3.2.1
OS Windows 10

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.