我需要采取的图像,并保存后,一些过程。当我显示图形时,它看起来很好,但保存图形后,在保存的图像周围有一些空白。我已经尝试了savefig方法的“紧”选项,也没有工作。代码:

  import matplotlib.image as mpimg
  import matplotlib.pyplot as plt

  fig = plt.figure(1)
  img = mpimg.imread("image.jpg")
  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()

当前回答

这适用于我保存一个numpy数组绘制的imshow文件

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()

其他回答

你可以通过在savefig中设置bbox_inch ="tight"来移除空白填充:

plt.savefig("test.png",bbox_inches='tight')

你必须把bbox_inch的参数作为一个字符串,也许这就是为什么它之前对你不起作用的原因。


可能的重复:

Matplotlib图:删除轴,图例和空白

如何设置matplotlib图的边距?

减少matplotlib图的左右边距

下面的函数包含了上面的johannes答案。我已经用plt测试过了。图和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')

最直接的方法是使用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')

然而,这可能不适用于修改图形的复杂图。参考Johannes S使用plt的答案。Subplots_adjust(如果是这样的话)。

我不能说我确切地知道为什么或我的“解决方案”是如何工作的,但这是我必须做的,当我想要绘制一对夫妇的轮廓翼翼部分-没有白边距-到一个PDF文件。 (注意,我在IPython笔记本中使用了matplotlib,带有-pylab标志。)

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.gca().xaxis.set_major_locator(plt.NullLocator())
plt.gca().yaxis.set_major_locator(plt.NullLocator())
plt.savefig("filename.pdf", bbox_inches = 'tight',
    pad_inches = 0)

我已经尝试停用不同的部分,但这总是导致一个白色边缘的地方。您甚至可以修改它,以保持胖线附近的数字限制,以避免由于缺乏边距而被剃除。

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

    import matplotlib.pyplot as plt
    arr = plt.imread(path)
    plt.imsave('test.png', arr)