在matplotlib中删除已保存图像周围的空白区域

Ahm*_*rak 138 python matplotlib

我需要拍摄一张图像并在一些过程后保存.当我显示它时,图形看起来很好,但是当我保存图形时,我在保存的图像周围有一些空白区域.我试过方法的'tight'选项savefig,也没用.代码:

  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()
Run Code Online (Sandbox Code Playgroud)

我试图通过在图上使用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("C:\\images\\1.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()
Run Code Online (Sandbox Code Playgroud)

Hoo*_*ked 164

您可以删除通过设置空格填充bbox_inches="tight"savefig:

plt.savefig("test.png",bbox_inches='tight')
Run Code Online (Sandbox Code Playgroud)

你必须把参数bbox_inches作为一个字符串,也许这就是为什么它不适合你的原因.


可能重复:

Matplotlib绘图:删除轴,图例和空格

如何设置matplotlib数字的边距?

减少matplotlib图中的左右边距

  • 这不是*非常正确.当你使用`bbox_inches`选项时,还有另一个默认值会留下一些空间.如果你真的想要摆脱一切,你还需要使用`pad_inches = 0.0`.当然,这种紧密填充经常被切断,例如指数...... (23认同)
  • 这根本不起作用,你仍然可以获得数字周围的空白.设置透明选项(如某些答案中所述)也没有任何帮助,空白仍然存在,它只是透明的. (8认同)
  • 要删除黑边,您可能需要设置`pad_inches = -0.1` (5认同)

小智 120

我不能说我确切地知道我的"解决方案"为什么或如何工作,但当我想将几个翼型部分的轮廓 - 没有白色边缘 - 绘制成PDF文件时,我必须这样做.(注意我在IPython笔记本中使用matplotlib,带有-pylab标志.)

gca().set_axis_off()
subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, 
            hspace = 0, wspace = 0)
margins(0,0)
gca().xaxis.set_major_locator(NullLocator())
gca().yaxis.set_major_locator(NullLocator())
savefig("filename.pdf", bbox_inches = 'tight',
    pad_inches = 0)
Run Code Online (Sandbox Code Playgroud)

我试图停用它的不同部分,但这总是导致某处的白色边缘.你可能甚至修改了这个以保持接近图形极限的胖线因缺少边缘而被剃光.

  • `pad_inches`帮助了我. (11认同)
  • 最后一些有用的东西,非常感谢你!顺便说一句,在我的情况下,只需要使用`set_major_locator`的两行. (6认同)
  • 我花了最后一小时尝试各种各样的东西,无法摆脱1px的白色边框.这是唯一有效的 - 特别是`pad_inches = 0`,其他答案没有提及. (6认同)
  • matplotlib.ticker.NullLocator() (5认同)
  • 唯一真正奏效的答案! (4认同)
  • 你是该死的英雄 (2认同)
  • 太感谢了 (2认同)

Ket*_*eto 17

最直接的方法是使用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')
Run Code Online (Sandbox Code Playgroud)

然而,对于修改图形的复杂绘图来说,这可能不是优选的。如果是这种情况,请参阅Johannes S 的答案plt.subplots_adjust


Moh*_*med 17

这对我有用 plt.savefig(save_path,bbox_inches='tight', pad_inches=0, transparent=True)

  • 不确定这与此处发布的其他答案有什么不同。 (3认同)

小智 14

我从Arvind Pereira(http://robotics.usc.edu/~ampereir/wordpress/?p=626)找到了一些东西,似乎对我有用:

plt.savefig(filename, transparent = True, bbox_inches = 'tight', pad_inches = 0)
Run Code Online (Sandbox Code Playgroud)

  • `transparent = True`会让它看起来没问题,但它只会隐藏空白区域,图像尺寸也不会好. (5认同)

Sua*_*ris 12

在尝试了上述答案但没有成功(以及大量其他堆栈文章)之后,最终对我有用的只是

plt.gca().set_axis_off()
plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, 
            hspace = 0, wspace = 0)
plt.margins(0,0)
plt.savefig("myfig.pdf")
Run Code Online (Sandbox Code Playgroud)

重要的是,这不包括bbox或padding参数。

  • 这应该是公认的答案。此外,您甚至不需要调用“set_axis_off”。它不会影响保存的图像,因为在“subplots_adjust”之后,轴位于图形的范围之外,并且无论如何都不会绘制图。然而,在 Jupyter 笔记本中,您需要显式禁用该轴,因为内联后端会覆盖这些设置。 (7认同)
  • 同意。这应该被接受为答案。我已经为这个问题苦苦挣扎了好几天,只有这段代码解决了我的问题。我已经尝试了很多(几个)stackoverflow 技巧和技巧、解决方法等,但没有成功。非常感谢@SuaveSouris。 (2认同)

小智 11

我发现以下代码可以很好地完成这项工作.

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)
Run Code Online (Sandbox Code Playgroud)

  • 一般来说,如果答案包含对代码的意图的解释,以及为什么在不引入其他代码的情况下解决问题,则答案会更有帮助. (2认同)

Tom*_*way 11

以下功能合并了上面的约翰尼斯答案。我有测试过plt.figure,并plt.subplots()与多个轴,它工作得很好。

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')
Run Code Online (Sandbox Code Playgroud)


Kha*_*han 8

我按照这个顺序,它就像一个魅力。

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)
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用;接受的答案没有。 (2认同)

小智 6

我发现一个更简单的方法是使用plt.imsave

    import matplotlib.pyplot as plt
    arr = plt.imread(path)
    plt.imsave('test.png', arr)
Run Code Online (Sandbox Code Playgroud)