Использование декоратора для сохранения графиков matplotlib;сохраненный вывод пуст - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь создать функцию декоратора @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 голосов
/ 23 ноября 2018

Вы звоните 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()
...