使用装饰器保存matplotlib图;保存的输出为空

时间:2018-11-23 16:02:51

标签: python pandas matplotlib python-decorators

我试图创建一个装饰器函数@save_fig来包装matplotlib函数(plot_this()),以便自动保存输出。

我可以让装饰器正确执行并显示/显示图形。但是,当评估plt.savefig()时,一个空白图形将保存到我的目录中。

我想知道我的装饰代码中缺少什么逻辑?输出应该可以从下面的代码中完全重现。

谢谢

import matplotlib.pyplot as plt
import pandas as pd

df = pd.DataFrame(data={'foo':list(range(5)), 'bar':list(range(5, 10, 1))})

def save_fig(**param):
    def outer(func):
        def inner(*args, **kwargs):
            ax = func(*args)
            if 'filename' in param.keys():
                print('filename')
                plt.savefig(param['filename'])
            elif 'show' in param.keys():
                print('show')
                plt.show()
            else:
                return ax
        return inner
    return outer

@save_fig(**{'filename': 'foo.png'})
def plot_this():
    plt.scatter(df['foo'], df['bar'])
    plt.show()

if __name__ == "__main__":
    plot_this()

1 个答案:

答案 0 :(得分:0)

在保存图形之前,您致电show。因此,保存的图形是一个新的空图形。由于无论如何您要在装饰器中处理show,因此就可以省去它。

import matplotlib.pyplot as plt
import pandas as pd

df = pd.DataFrame(data={'foo':list(range(5)), 'bar':list(range(5, 10, 1))})

def save_fig(**param):
    def outer(func):
        def inner(*args, **kwargs):
            artist = func(*args)
            if 'filename' in param.keys():
                print('filename')
                plt.savefig(param['filename'])
            if 'show' in param.keys() and param["show"]:
                print('show')
                plt.show()
            else:
                return artist
        return inner
    return outer

@save_fig(**{'filename': 'foo.png', 'show' : True})
def plot_this():
    return plt.scatter(df['foo'], df['bar'])


if __name__ == "__main__":
    plot_this()