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

sun*_*mat 240 python matplotlib

我是Python和Matplotlib的新手,我想简单地将colormap应用于图像并编写生成的图像,而不使用轴,标签,标题或通常由matplotlib自动添加的任何内容.这是我做的:

def make_image(inputname,outputname):
    data = mpimg.imread(inputname)[:,:,0]
    fig = plt.imshow(data)
    fig.set_cmap('hot')
    fig.axes.get_xaxis().set_visible(False)
    fig.axes.get_yaxis().set_visible(False)
    plt.savefig(outputname)
Run Code Online (Sandbox Code Playgroud)

它成功地移除了图形的轴,但保存的图形呈现白色填充和实际图像周围的框架.如何删除它们(至少是白色填充)?谢谢

Hoo*_*ked 320

我认为该命令axis('off')比单独更改每个轴和边界更简洁地处理其中一个问题.然而,它仍然留下边界周围的白色空间.添加bbox_inches='tight'savefig命令几乎可以到达那里,您可以在下面的示例中看到剩下的空白区域要小得多,但仍然存在.

from numpy import random
import matplotlib.pyplot as plt

data = random.random((5,5))
img = plt.imshow(data, interpolation='nearest')
img.set_cmap('hot')
plt.axis('off')
plt.savefig("test.png", bbox_inches='tight')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 结合问题({fig.axes.get_xaxis().set_visible(False)&fig.axes.get_yaxis().set_visible(False)}中的方法与{plt.axis('off')})修复了问题我.(不再有空格).并且不要忘记将savefig中的{pad_inches}设置为0. (5认同)
  • 按照unutbu的建议,你可以使用`fig = plt.figure()`,`ax = plt.axes([0,0,1,1])`,然后`plt.imshow(data,interpolation ="nearest"`结合`plt.axis("off")`,它应该摆脱图像本身旁边的一切,希望! (4认同)
  • 我刚遇到这个问题,这个线程中没有任何解决方案和链接的解决方案都有效.但是明确指定`bbox_inches = 0`就可以了. (3认同)
  • 这不再起作用了。我花了一个小时才弄明白。请参阅下面的答案。 (2认同)

unu*_*tbu 94

我从matehat那里学到了这个技巧,在这里:

import matplotlib.pyplot as plt
import numpy as np

def make_image(data, outputname, size=(1, 1), dpi=80):
    fig = plt.figure()
    fig.set_size_inches(size)
    ax = plt.Axes(fig, [0., 0., 1., 1.])
    ax.set_axis_off()
    fig.add_axes(ax)
    plt.set_cmap('hot')
    ax.imshow(data, aspect='equal')
    plt.savefig(outputname, dpi=dpi)

# data = mpimg.imread(inputname)[:,:,0]
data = np.arange(1,10).reshape((3, 3))

make_image(data, '/tmp/out.png')
Run Code Online (Sandbox Code Playgroud)

产量

在此输入图像描述

  • @Yann,除了文档之外,我发现一次注释掉一行以查看每个命令有什么影响非常有帮助.这是经验方式! (4认同)
  • 我很确定你有正确的答案(虽然可能不止一种方法),但我想知道你是否可以解释*为什么*这是正确的答案?您的代码如何删除空格? (2认同)
  • 删除白色边框的行是`plt.Axes(fig,[0,0,1,1])`。这告诉matplotlib创建一组轴,该轴的左下角位于(0%,0%)的点,宽度和高度为(100%,100%)。 (2认同)
  • `ax.set_axis_off()` 就是我正在寻找的。`plt.axis('off')` 让我的整个情节变得空白。 (2认同)

Dom*_*goj 48

最简单的解决方案:

我简单地将问题中描述的方法与Hooked的答案中的方法结合起来.

fig = plt.imshow(my_data)
plt.axis('off')
fig.axes.get_xaxis().set_visible(False)
fig.axes.get_yaxis().set_visible(False)
plt.savefig('pict.png', bbox_inches='tight', pad_inches = 0)
Run Code Online (Sandbox Code Playgroud)

在此代码之后,没有空格,也没有框架.

没有空格,轴或框架

  • 是,如果您不调用此命令,则将删除大多数空格.但是在我的情况下,我的情节和.png图像的边缘之间仍然有一些空格(可能是2px宽).通过调用以下命令,我已经摆脱了那些顽固的空间. (5认同)
  • 你的方法确实删除了这个图像周围的所有空白,干得好,但我仍然不知道为什么要添加命令`fig.axes.get_xaxis().set_visible(False)`解决问题.谢谢 (3认同)
  • 但请注意,如果在同一图中存在多个轴(在我的情况下是图中的嵌入图像),上述操作将失败.解决方案:`fig.axes [0]`,通常是所有或选定的轴. (3认同)

lua*_*tor 25

还没有人提到imsave,这使得它成为一个单行:

import matplotlib.pyplot as plt
import numpy as np

data = np.arange(10000).reshape((100, 100))
plt.imsave("/tmp/foo.png", data, format="png", cmap="hot")
Run Code Online (Sandbox Code Playgroud)

它直接存储图像,即不添加任何轴或边框/填充.

在此输入图像描述


小智 20

plt.axis('off')
Run Code Online (Sandbox Code Playgroud)

plt.savefig('example.png',bbox_inches='tight',pad_inches = 0)

让我得到无边框图像。


小智 11

我发现这一切都记录在案......

https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.axes.Axes.axis.html#matplotlib.axes.Axes.axis

我的代码…… “bcK”是一个 512x512 的图像

plt.figure()
plt.imshow(bck)
plt.axis("off")   # turns off axes
plt.axis("tight")  # gets rid of white border
plt.axis("image")  # square up the image instead of filling the "figure" space
plt.show()
Run Code Online (Sandbox Code Playgroud)


Mig*_*rro 9

您还可以为参数指定图形的范围bbox_inches.这将摆脱图周围的白色填充.

def make_image(inputname,outputname):
    data = mpimg.imread(inputname)[:,:,0]
    fig = plt.imshow(data)
    fig.set_cmap('hot')
    ax = fig.gca()
    ax.set_axis_off()
    ax.autoscale(False)
    extent = ax.get_window_extent().transformed(plt.gcf().dpi_scale_trans.inverted())
    plt.savefig(outputname, bbox_inches=extent)
Run Code Online (Sandbox Code Playgroud)


Vla*_*nov 7

这应该删除所有填充和边框:

from matplotlib import pyplot as plt

fig = plt.figure()
fig.patch.set_visible(False)

ax = fig.add_subplot(111)

plt.axis('off')
plt.imshow(data)

extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig("../images/test.png", bbox_inches=extent)
Run Code Online (Sandbox Code Playgroud)


小智 6

我喜欢ubuntu 的答案,但它没有明确显示如何设置开箱即用的非方形图像的大小,所以我修改了它以便于复制粘贴:

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

def save_image_fix_dpi(data, dpi=100):
    shape=np.shape(data)[0:2][::-1]
    size = [float(i)/dpi for i in shape]

    fig = plt.figure()
    fig.set_size_inches(size)
    ax = plt.Axes(fig,[0,0,1,1])
    ax.set_axis_off()
    fig.add_axes(ax)
    ax.imshow(data)
    fig.savefig('out.png', dpi=dpi)
    plt.show()
Run Code Online (Sandbox Code Playgroud)

如果保留 Pixel_size/dpi=size,无论您选择什么 dpi,保存无边框图像都很容易。

data = mpimg.imread('test.png')
save_image_fix_dpi(data, dpi=100)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

然而显示却很诡异。如果您选择较小的 dpi,则图像尺寸可能会大于屏幕,并且在显示过程中会出现边框。不过,这并不影响储蓄。

因此对于

save_image_fix_dpi(data, dpi=20)
Run Code Online (Sandbox Code Playgroud)

显示变为有边框(但保存有效): 在此输入图像描述


epi*_*ang 6

赞成的答案不再有效。要使其正常工作,您需要手动添加设置为 [0, 0, 1, 1] 的轴,或删除图下的补丁。

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(5, 5), dpi=20)
ax = plt.Axes(fig, [0., 0., 1., 1.])
fig.add_axes(ax)
plt.imshow([[0, 1], [0.5, 0]], interpolation="nearest")
plt.axis('off')                                # same as: ax.set_axis_off()

plt.savefig("test.png")

Run Code Online (Sandbox Code Playgroud)

或者,您可以删除补丁。您不需要添加子图来删除填充。这是从下面 Vlady 的回答中简化

fig = plt.figure(figsize=(5, 5))
fig.patch.set_visible(False)                   # turn off the patch

plt.imshow([[0, 1], [0.5, 0]], interpolation="nearest")
plt.axis('off')

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

这是3.0.3在 2019/06/19 上测试的版本。图片见下图:

在此处输入图片说明

更简单的事情是使用pyplot.imsave. 详情请看下面luator的回答