Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在matplotlib中删除已保存图像周围的空白_Python_Matplotlib - Fatal编程技术网

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