代码之家  ›  专栏  ›  技术社区  ›  Chef1075

使用decorator保存matplotlib图;保存的输出为空

  •  0
  • Chef1075  · 技术社区  · 6 年前

    我正在尝试创建一个修饰函数 @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 回复  |  直到 6 年前
        1
  •  0
  •   ImportanceOfBeingErnest    6 年前

    你打电话 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()