使用try / except来处理多个图

时间:2014-12-16 18:40:33

标签: python matplotlib try-catch

我生成一个由几个单独的图组成的图像。由于其中任何一个都无法生成(出于各种原因),我使用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的正确使用吗?这对我来说似乎有点难看和重复,有没有更好的方法来实现这个目标?

2 个答案:

答案 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