我生成一个由几个单独的图组成的图像。由于其中任何一个都无法生成(出于各种原因),我使用try / except
分别处理每一个。
这是我正在做的事情的一个例子:
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
fig = plt.figure(figsize=(10, 20)) # create the top-level container
gs = gridspec.GridSpec(10, 5) # create a GridSpec object
# Define lots of arguments to feed each plot.
try:
plot1(*args1)
except:
print 'Failed to generate plot1'
try:
plot2(*args2)
except:
print 'Failed to generate plot2'
try:
plot3(*args3)
except:
print 'Failed to generate plot3'
try:
plot4(*args4)
except:
print 'Failed to generate plot4'
...
fig.tight_layout()
plt.savefig('out_image.png', dpi=300)
每个plotX()
函数都是唯一的(总共将近30个),并在最终图像中生成包含所有这些函数的单个图。
问题是:这是try/except
的正确使用吗?这对我来说似乎有点难看和重复,有没有更好的方法来实现这个目标?
答案 0 :(得分:2)
您应该将plotX(*args)
包装到另一个函数plot(N, *args)
中。然后你可以像这样循环:
for n, args in enumerate(list_of_arglists, 1):
plot(n, *args)
所以plot
看起来像这样:
def plot(n, *args):
plotter_map = {
1: plot1,
2: plot2,
3: plot3,
# ...,
N: plotN
}
fxn = plotter_map.get(N, None)
if fxn is None:
raise ValueError("there is no `plot{}`".format(N))
try:
fxn(*args)
except:
print("failed to run `plot{}`".format(N))
很容易。
答案 1 :(得分:0)
您可以在方法之外进行迭代。这样,该方法不必根据您要生成的图的数量而改变。
def plot_args(args, functionToCall, count):
try:
funtionToCall(args)
except:
print('Failed to generate plot ' + str(count) + '.')
args_list = [(args1, plot1), (args2, plot2) ..., (argsn, plotn)] # Make a list of all args to be processed.
count = 1
for i in args_list:
plot_args(i[0], i[1], count)
count +=1