在已使用set_axis_off,bbox_inches = tight和pad_inches = 0的matplotlib折线图中删除填充?

时间:2018-01-05 16:09:26

标签: python image matplotlib plot

我正在尝试将某些数据绘制为给定大小的图像(用作叠加层)。但是,尽管在set_axis_off()上调用了bbox_inches="tight"并设置了pad_inches=0savefig(正如其他问题所示),我仍然会得到填充,并且图像尺寸应比figsize更大结果。

这是代码(PIL依赖性是为了易于使用,但可以通过删除最后一行来删除):

from PIL import Image
import matplotlib.pyplot as plt

def plot_box(data, size, filename="plot.png"):
    """Plot the data in an image whose dimensions are size x size pixels"""
    fig = plt.figure(figsize=(size/100,size/100), dpi=100)
    ax = fig.add_axes((0,0,1,1))
    ax.set_axis_off()
    ax.plot(data)
    ax.get_xaxis().set_visible(False)
    ax.get_yaxis().set_visible(False)
    plt.savefig(filename, bbox_inches="tight", pad_inches=0, dpi='figure', transparent=True)
    plt.close()
    return Image.open(filename)

然而,无论我指定的尺寸如何,图像在两个方向上总是宽6或7像素:

>> data = [i**2 for i in range(-100, 101)]
>> plot_box(data, 50)
<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=57x57 at 0xED3CB38>
>> plot_box(data, 100)
<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=106x106 at 0xF208908>
>> plot_box(data, 1)
<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=8x8 at 0x53D2748>

有什么想法吗?

更新

以下是来自plot_box(data, 100)的结果图片。正如你所看到的,除了因填充(106x106而不是100x100)而超出预期之外,它看起来还不错。

enter image description here

1 个答案:

答案 0 :(得分:1)

bbox_inches="tight"电话中移除savefig。然后,您也不需要pad_inches

plt.savefig(filename, dpi='figure', transparent=True)

这将产生100x100像素的图像。

如果您也不想在轴内设置任何边距,请将其设置为0,

ax.margins(0)