使用matplotlib

时间:2019-03-19 20:23:20

标签: python matplotlib

我正在尝试使用imshow从数组中生成图像,并将其导出到文件中而不添加任何空格。

在数据的宽度和高度相等的情况下,我设法通过遵循this answer来实现:

import numpy as np
import matplotlib.pyplot as plt
def borderless_imshow_save(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)

    ax.imshow(data);
    plt.savefig(outputname, dpi=dpi)

data = np.random.randn(40, 40)
borderless_imshow_save(data, 'test.png', dpi=100)

这很好用。 但是,实际上,我需要对矩形的数据执行此操作,即类似np.random.randn(40, 100)

在这种情况下,上面的代码不起作用,因为在最终图像中再次产生了空格。 我尝试使用size参数和plt.Axes的参数,但没有成功。

实现此目标的最佳方法是什么?

请注意,imsave实际上在这里与

类似
plt.imsave('test.png', np.random.randn(40, 100))

问题在于,imsave无法获得与imshow相同数量的选项。

2 个答案:

答案 0 :(得分:1)

问题是您要用size=(1,1)指定一个正方形图形大小,然后绘制一个矩形图像。我已经修改了您的代码,以通过自动设置图形大小以匹配输入数据的尺寸来消除图形周围的空白。现在,size参数指定图像的宽度,并从中缩放高度:

import numpy as np
import matplotlib.pyplot as plt

def borderless_imshow_save(data, outputname, size = 1, dpi=80):
    width = 1*size
    height = data.shape[0] / data.shape[1] * size
    size=(width, height)
    fig = plt.figure(figsize=size, dpi=dpi)
    ax = fig.add_axes([0, 0, 1, 1])
    ax.set_axis_off()

    ax.imshow(data);
    fig.savefig(outputname, dpi=dpi)

data = np.random.randn(40, 100)
borderless_imshow_save(data, 'test.png', size=5, dpi=100)

保存的图像:

Image with no borders

答案 1 :(得分:1)

一个简单的选择是不关心图形的实际大小,而只是在保存时自动裁剪图像。

import numpy as np
import matplotlib.pyplot as plt

data = np.random.randn(40, 100)
fig, ax = plt.subplots()
ax.imshow(data)
ax.set_axis_off()
fig.savefig("data.png", bbox_inches="tight", pad_inches=0)