我试图创建一个装饰器函数@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()
答案 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()