Я пытаюсь создать функцию декоратора @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()






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