我是 Python 和 Matplotlib 的新手,我想简单地将颜色图应用于图像并写入结果图像,而不使用轴、标签、标题或任何通常由 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)
它成功地移除了图形的轴,但保存的图形在实际图像周围显示了一个白色填充和一个框架。如何删除它们(至少是白色填充)?谢谢
imshow
上。如果您有散点图,则以下答案可能会对您有所帮助:stackoverflow.com/a/40727744/4124317
我认为命令 axis('off')
比单独更改每个轴和边框更简洁地解决了其中一个问题。然而,它仍然在边界周围留下空白区域。将 bbox_inches='tight'
添加到 savefig
命令几乎可以让您到达那里,您可以在下面的示例中看到剩余的空白要小得多,但仍然存在。
请注意,较新版本的 matplotlib 可能需要 bbox_inches=0
而不是字符串 'tight'
(通过 @episodeyang 和 @kadrach)
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')
https://i.stack.imgur.com/4ZMuW.png
我从 matehat, here 学到了这个技巧:
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')
产量
https://i.stack.imgur.com/dyCKl.png
plt.Axes(fig, [0,0,1,1])
。这告诉 matplotlib 创建一组轴,其左下角位于 (0 %, 0 %) 处,宽度和高度为 (100 %, 100 %)。
可能最简单的解决方案:
我只是简单地将问题中描述的方法和 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)
在这段代码之后没有空格和框架。
https://i.stack.imgur.com/kzrdo.png
fig.axes.get_xaxis().set_visible(False)
可以解决问题。谢谢
fig.axes[0]
,通常是所有或选定的轴。
还没有人提到 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")
它直接按原样存储图像,即不添加任何轴或边框/填充。
https://i.stack.imgur.com/NQv8Z.png
plt.axis('off')
plt.savefig('example.png',bbox_inches='tight',pad_inches = 0)
让我得到无边界的图像。
我发现这一切都记录在案...
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()
这应该删除所有填充和边框:
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)
extent = plt.gca().get_window_extent().transformed(fig.dpi_scale_trans.inverted())
的 Axes 对象 (ax
),它也可以工作。
您还可以在 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)
赞成的答案不再起作用。要让它工作,你需要手动添加一个轴设置为 [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")
或者,您可以删除补丁。您无需添加子图即可删除填充。这是从 Vlady's answer below 简化的
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')
这是在 2019 年 6 月 19 日使用版本 3.0.3
进行测试的。图片见下图:
https://i.stack.imgur.com/tFV46.png
更简单的做法是使用 pyplot.imsave
。有关详细信息,see luator's answer bellow
我喜欢 ubuntu's 答案,但它没有明确显示如何设置开箱即用的非方形图像的大小,因此我对其进行了修改以便于复制粘贴:
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()
如果保留 pixel_size/dpi=size,则无论您选择什么 dpi,保存无边框图像都很容易。
data = mpimg.imread('test.png')
save_image_fix_dpi(data, dpi=100)
https://i.stack.imgur.com/viokB.png
然而,显示令人毛骨悚然。如果您选择小 dpi,您的图像尺寸可能会大于您的屏幕,并且在显示过程中会出现边框。不过,这并不影响储蓄。
因此对于
save_image_fix_dpi(data, dpi=20)
https://i.stack.imgur.com/jtkq2.png
这最终对我有用:
ax.margins(x=0, y=0, tight=True) 是关键线。
fig = plt.figure(figsize=(8, 8))
ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.set_axis_off()
ax.margins(x=0, y=0, tight=True)
fig.add_axes(ax)
for triangle in list_of_triangles:
x_points = [point[0] for point in triangle]
y_points = [point[1] for point in triangle]
plt.fill(x_points, y_points, 'k', edgecolor='k')
plt.savefig("test.png", bbox_inches=0, pad_inches=0)
plt.show()
首先,对于某些图像格式(即 TIFF),您实际上可以将颜色图保存在标题中,并且大多数查看器将使用颜色图显示您的数据。
为了保存实际的 matplotlib
图像,这对于向图像添加注释或其他数据很有用,我使用了以下解决方案:
fig, ax = plt.subplots(figsize=inches)
ax.matshow(data) # or you can use also imshow
# add annotations or anything else
# The code below essentially moves your plot so that the upper
# left hand corner coincides with the upper left hand corner
# of the artist
fig.subplots_adjust(left=0, right=1, top=1, bottom=0, wspace=0, hspace=0)
# now generate a Bbox instance that is the same size as your
# single axis size (this bbox will only encompass your figure)
bbox = matplotlib.transforms.Bbox(((0, 0), inches))
# now you can save only the part of the figure with data
fig.savefig(savename, bbox_inches=bbox, **kwargs)
感谢大家的精彩回答......我想绘制一个没有额外填充/空间等的图像时遇到了完全相同的问题,所以非常高兴在这里找到每个人的想法。
除了没有填充的图像之外,我还希望能够轻松添加注释等,而不仅仅是一个简单的图像图。
所以我最终做的是将 David's answer 与 csnemes' 结合起来,在图形创建时制作一个简单的包装器。当您使用它时,您以后不需要使用 imsave() 或其他任何东西进行任何更改:
def get_img_figure(image, dpi):
"""
Create a matplotlib (figure,axes) for an image (numpy array) setup so that
a) axes will span the entire figure (when saved no whitespace)
b) when saved the figure will have the same x/y resolution as the array,
with the dpi value you pass in.
Arguments:
image -- numpy 2d array
dpi -- dpi value that the figure should use
Returns: (figure, ax) tuple from plt.subplots
"""
# get required figure size in inches (reversed row/column order)
inches = image.shape[1]/dpi, image.shape[0]/dpi
# make figure with that size and a single axes
fig, ax = plt.subplots(figsize=inches, dpi=dpi)
# move axes to span entire figure area
fig.subplots_adjust(left=0, right=1, top=1, bottom=0, wspace=0, hspace=0)
return fig, ax
这对我来说可以去除蜱虫:
fig, axes = plt.subplots(2, figsize=(15, 20))
for ax in axes:
ax.get_xaxis().set_ticks([])
ax.get_yaxis().set_ticks([])
在代码末尾使用它:
plt.imsave(filename, img)
plt.imsave
已经是 answered by @luator in 2017。回答旧问题时,请在发布前检查重复项。
fig = plt.figure()
、ax = plt.axes([0,0,1,1])
,然后是plt.imshow(data,interpolation="nearest"
。结合plt.axis("off")
,它应该摆脱图像本身之外的所有内容,希望如此!bbox_inches=0
就可以了。