我有一个深度为3的嵌套字典data
。data[key1]
是字典,data[key1][key2]
也是字典,data[key1][key2][key3]
是数字。
我需要循环遍历不同的深度,目前我使用多个共享大量代码的函数来实现。我在下面的示例中标记了仅有的3行不同。如何避免代码重复?
def plot_measured_vs_fixed(data, noise, metric, aois, nfig):
n_aois = len(aois)
plt.figure(nfig, figsize=(FIGURE_SIZE*n_aois,FIGURE_SIZE)).clf()
tilts = ["measured","fixed"] # <<<<<<<<<<<<<< HERE!
ymin, ymax = np.inf, -np.inf
for i in range(n_aois):
if i == 0:
ax = ax0 = plt.subplot(1,n_aois,1)
else:
ax = plt.subplot(1,n_aois,i+1, sharey=ax0)
plt.setp(ax.get_yticklabels(), visible=False)
aoi = aois[i]
values = [data[tilt][aoi+metric][noise] for tilt in tilts] # <<<<<<<<<<<<<< HERE!
barplot(tilts, values, aoi) # <<<<<<<<<<<<<< HERE!
vmin, vmax = min(values), max(values)
if ymin > vmin:
ymin = vmin
if ymax < vmax:
ymax = vmax
d = (ymax - ymin) / 4
ymin, ymax = ymin - d, ymax + d
plt.ylabel(metric+" (%)", size=20)
plt.ylim(ymin,ymax)
plt.title(metric)
plt.tight_layout()
def plot_base_vs_worst(data, tilt, metric, aois, nfig):
n_aois = len(aois)
plt.figure(nfig, figsize=(FIGURE_SIZE*n_aois,FIGURE_SIZE)).clf()
noises = ["base","worst"] # <<<<<<<<<<<<<< HERE!
ymin, ymax = np.inf, -np.inf
for i in range(n_aois):
if i == 0:
ax = ax0 = plt.subplot(1,n_aois,1)
else:
ax = plt.subplot(1,n_aois,i+1, sharey=ax0)
plt.setp(ax.get_yticklabels(), visible=False)
aoi = aois[i]
values = [data[tilt][aoi+metric][noise] for noise in noises] # <<<<<<<<<<<<<< HERE!
barplot(noises, values, aoi) # <<<<<<<<<<<<<< HERE!
vmin, vmax = min(values), max(values)
if ymin > vmin:
ymin = vmin
if ymax < vmax:
ymax = vmax
d = (ymax - ymin) / 4
ymin, ymax = ymin - d, ymax + d
plt.ylim(ymin,ymax)
plt.ylabel(metric+" (%)", size=20)
plt.title(metric)
plt.tight_layout()
答案 0 :(得分:1)
这是python。您可以定义功能,以便可以指定倾斜和噪声。 根据设置的内容,您可以使用一个参数(和另一个参数列表)或另一个参数。快速草绘如何看起来:
def plot_index_diff(data, metric, aois, nfig, noise="", tilt=""):
...
noises = ["base","worst"]
tilts = ["measured","fixed"]
if tilt != "":
values = [data[tilt][aoi+metric][name] for name in noises]
barplot(noises, values, aoi)
if noise != "":
values = [data[name][aoi+metric][noise] for name in noises]
barplot(tilts, values, aoi)
...
如果您稍微重新设计界面,事情会变得更加容易。