Python 在matplotlib中删除已保存图像周围的空白
我需要拍摄一张照片,经过一些处理后保存。当我显示图形时,它看起来很好,但是在保存图形后,在保存的图像周围有一些空白。我尝试了Python 在matplotlib中删除已保存图像周围的空白,python,matplotlib,Python,Matplotlib,我需要拍摄一张照片,经过一些处理后保存。当我显示图形时,它看起来很好,但是在保存图形后,在保存的图像周围有一些空白。我尝试了savefig方法的'tight'选项,但也没有成功。守则: import matplotlib.image as mpimg import matplotlib.pyplot as plt fig = plt.figure(1) img = mpimg.imread(path) plt.imshow(img) ax=fig.add_subplot
savefig
方法的'tight'
选项,但也没有成功。守则:
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
fig = plt.figure(1)
img = mpimg.imread(path)
plt.imshow(img)
ax=fig.add_subplot(1,1,1)
extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig('1.png', bbox_inches=extent)
plt.axis('off')
plt.show()
我试图通过在图形上使用NetworkX绘制一个基本图形并保存它。我意识到,如果没有图形,它是可以工作的,但是当添加图形时,我在保存的图像周围得到了空白
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import networkx as nx
G = nx.Graph()
G.add_node(1)
G.add_node(2)
G.add_node(3)
G.add_edge(1,3)
G.add_edge(1,2)
pos = {1:[100,120], 2:[200,300], 3:[50,75]}
fig = plt.figure(1)
img = mpimg.imread("image.jpg")
plt.imshow(img)
ax=fig.add_subplot(1,1,1)
nx.draw(G, pos=pos)
extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig('1.png', bbox_inches = extent)
plt.axis('off')
plt.show()
您可以通过在
savefig
中设置bbox\u inches=“tight”
来删除空白填充:
plt.savefig("test.png",bbox_inches='tight')
您必须将参数作为字符串放到bbox_inches
中,也许这就是它之前不适用于您的原因
可能的重复项:
我不能说我确切地知道我的“解决方案”为什么或如何工作,但当我想将两个机翼部分的轮廓(没有白边)绘制到PDF文件时,我必须这样做。 (请注意,我在IPython笔记本中使用了matplotlib,并带有-pylab标志。)
我试着去激活它的不同部分,但这总是会导致某个地方出现空白。您甚至可以修改此选项,以避免因缺少边距而刮去接近图形边界的肥线。我从Arvind Pereira()那里找到了一些东西,似乎对我有用:
plt.savefig(filename, transparent = True, bbox_inches = 'tight', pad_inches = 0)
这对我来说很有用,可以将使用imshow绘制的numpy数组保存到文件中
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(10,10))
plt.imshow(img) # your image here
plt.axis("off")
plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0,
hspace = 0, wspace = 0)
plt.savefig("example2.png", box_inches='tight', dpi=100)
plt.show()
我发现以下代码非常适合这份工作
fig = plt.figure(figsize=[6,6])
ax = fig.add_subplot(111)
ax.imshow(data)
ax.axes.get_xaxis().set_visible(False)
ax.axes.get_yaxis().set_visible(False)
ax.set_frame_on(False)
plt.savefig('data.png', dpi=400, bbox_inches='tight',pad_inches=0)
在尝试了上面的答案但没有成功(以及大量其他帖子)之后,最终对我有效的是
plt.gca().set_axis_off()
plt.子批次调整(顶部=1,底部=0,右侧=1,左侧=0,
hspace=0,wspace=0)
利润率(0,0)
plt.savefig(“myfig.pdf”)
重要的是,这不包括bbox或padding参数。我遵循了这个顺序,它就像一个符咒
plt.axis("off")
fig=plt.imshow(image array,interpolation='nearest')
fig.axes.get_xaxis().set_visible(False)
fig.axes.get_yaxis().set_visible(False)
plt.savefig('destination_path.pdf',
bbox_inches='tight', pad_inches=0, format='pdf', dpi=1200)
以下函数包含上述johannes-s答案。我用多轴的plt.figure和plt.subplot()对它进行了测试,效果很好
def save(filepath, fig=None):
'''Save the current image with no whitespace
Example filepath: "myfig.png" or r"C:\myfig.pdf"
'''
import matplotlib.pyplot as plt
if not fig:
fig = plt.gcf()
plt.subplots_adjust(0,0,1,1,0,0)
for ax in fig.axes:
ax.axis('off')
ax.margins(0,0)
ax.xaxis.set_major_locator(plt.NullLocator())
ax.yaxis.set_major_locator(plt.NullLocator())
fig.savefig(filepath, pad_inches = 0, bbox_inches='tight')
我发现一种更简单的方法是使用
plt.imsave
:
import matplotlib.pyplot as plt
arr = plt.imread(path)
plt.imsave('test.png', arr)
最直接的方法是使用
plt.tight_layout
转换,这实际上更可取,因为在使用plt.savefig
import matplotlib as plt
plt.plot([1,2,3], [1,2,3])
plt.tight_layout(pad=0)
plt.savefig('plot.png')
但是,对于修改图形的复杂绘图来说,这可能不是最好的。如果是这种情况,请参阅使用
plt。子绘图调整
。对于希望以像素而不是英寸为单位工作的任何人来说,这都是可行的
再加上你通常需要的
from matplotlib.transforms import Bbox
然后,您可以使用以下选项:
my_dpi = 100 # Good default - doesn't really matter
# Size of output in pixels
h = 224
w = 224
fig, ax = plt.subplots(1, figsize=(w/my_dpi, h/my_dpi), dpi=my_dpi)
ax.set_position([0, 0, 1, 1]) # Critical!
# Do some stuff
ax.imshow(img)
ax.imshow(heatmap) # 4-channel RGBA
ax.plot([50, 100, 150], [50, 100, 150], color="red")
ax.axis("off")
fig.savefig("saved_img.png",
bbox_inches=Bbox([[0, 0], [w/my_dpi, h/my_dpi]]),
dpi=my_dpi)
你可以试试这个。它解决了我的问题
import matplotlib.image as mpimg
img = mpimg.imread("src.png")
mpimg.imsave("out.png", img, cmap=cmap)
这对我有用
plt.savefig(save_path,bbox_inches='tight',pad_inches=0,transparent=True)
因此解决方案取决于您是否调整子批次。如果指定plt.subplots\u adjust(上、下、右、左),则不希望将bbox\u inches='tight'的kwargs与plt.savefig一起使用,因为它会矛盾地创建空白填充。它还允许您将图像保存为与输入图像相同的DIM(600x600输入图像保存为600x600像素输出图像)
如果您不关心输出图像大小的一致性,可以省略plt.subplot\u adjust属性,只需将bbox\u inches='tight'和pad\u inches=0 kwargs与plt.savefig一起使用即可
此解决方案适用于matplotlib版本3.0.1、3.0.3和3.2.1。当您有超过1个子批次(例如plt子批次(2,2,…)时,它也起作用
如果您有多个子批并且希望保存每个子批,您也可以将其与
fig.savefig()
一起使用。(plt.savefig()
在这种情况下不起作用。)这不太正确。当你使用bbox\u inches
选项时,还有一个默认值会留下一些空间。如果你真的想摆脱一切,你还需要使用pad\u inches=0.0
。当然,这种紧凑的填充经常会被切断,例如,指数…为了去除黑边,你可能需要设置>pad_inches=-0.1
这根本不起作用,图形周围仍然有空白。设置透明选项(如一些答案中所述)也没有什么帮助,空白仍然存在,它只是透明的。@piperchester这是一个好问题,但可能应该作为一个新问题提出,这样它就不会在评论中消失。不过,你应该将新问题链接到旧问题!可能对我来说真正有效的重复是使用其他工具,如pdfcrop。终于可以使用了,非常感谢!顺便说一句,在我的例子中,只有使用set\u major\u locator
的两行代码是必要的。我花了最后一个小时尝试了各种各样的东西,但无法摆脱1px的白色边框。这是唯一有效的东西-特别是pad\u inches=0
which其他答案不提。pad_inches
帮了我的忙。你是个该死的heromatplotlib.ticker.NullLocator()一般来说,如果答案中包含对代码意图的解释,以及在不介绍其他内容的情况下解决问题的原因,那么答案会更有帮助。transparent=True
会让人觉得没有问题,但只会隐藏空白,图像尺寸不合适。感谢您提及pad\u inches
!我希望我早就知道这个选项!这个选项适用于大多数绘图,但它删除了我的混淆矩阵的右边框。只需添加一个小填充pad_inches=.25
实际上,我发现这个答案很简单,使用起来更方便。这个对我有效;接受的答案没有。在我的情况下,使用两个参数bbox_inch在savefig
命令中,es='tight'
,pad_inches=0
使其工作完美。Und
import matplotlib.image as mpimg
img = mpimg.imread("src.png")
mpimg.imsave("out.png", img, cmap=cmap)
def save_inp_as_output(_img, c_name, dpi=100):
h, w, _ = _img.shape
fig, axes = plt.subplots(figsize=(h/dpi, w/dpi))
fig.subplots_adjust(top=1.0, bottom=0, right=1.0, left=0, hspace=0, wspace=0)
axes.imshow(_img)
axes.axis('off')
plt.savefig(c_name, dpi=dpi, format='jpeg')