diff --git a/gstlal-calibration/tests/check_calibration/plot_kappas_from_txt.py b/gstlal-calibration/tests/check_calibration/plot_kappas_from_txt.py
index d6555a1b61787d26b89700cfeafb7a9cfb691714..1c55d6ade2fb6149189707b136d1adde2ad90b38 100644
--- a/gstlal-calibration/tests/check_calibration/plot_kappas_from_txt.py
+++ b/gstlal-calibration/tests/check_calibration/plot_kappas_from_txt.py
@@ -69,12 +69,11 @@ txt_list = options.txt_list.split(':')
 for i in range(len(txt_list)):
 	data.append([])
 	labels.append([])
-	ylabels.append([])
+	ylabels.append(None)
 	txt_list[i] = txt_list[i].split(';')
 	for j in range(len(txt_list[i])):
 		data[i].append([])
 		labels[i].append([])
-		ylabels[i].append(None)
 		txt_list[i][j] = txt_list[i][j].split(',')
 		for k in range(len(txt_list[i][j])):
 			data[i][j].append(np.loadtxt(txt_list[i][j][k]).transpose())
@@ -85,140 +84,140 @@ for i in range(len(txt_list)):
 			if 'tst' in txt_list[i][j][k] or 'TST' in txt_list[i][j][k]:
 				if 'imag' in txt_list[i][j][k] or 'IMAG' in txt_list[i][j][k]:
 					labels[i][j][k] += r': $\Im(\kappa_{\rm T})$'
-					ylabels[i][j] = "Correction"
+					ylabels[i] = "Correction"
 					if j == 0 and k == 0:
 						data_min.append(-0.1)
 						data_max.append(0.1)
 				elif 'real' in txt_list[i][j][k] or 'REAL' in txt_list[i][j][k]:
 					labels[i][j][k] += r': $\Re(\kappa_{\rm T})$'
-					ylabels[i][j] = "Correction"
+					ylabels[i] = "Correction"
 					if j == 0 and k == 0:
 						data_min.append(0.9)
 						data_max.append(1.1)
 				elif 'tau' in txt_list[i][j][k] or 'TAU' in txt_list[i][j][k]:
 					labels[i][j][k] += r': $\tau_{\rm T}$'
-					ylabels[i][j] = "Time ($\mu$s)"
+					ylabels[i] = "Time ($\mu$s)"
 					if j == 0 and k == 0:
 						data_min.append(-1000)
 						data_max.append(1000)
 				else:
 					# Assume it's the magnitude
 					labels[i][j][k] += r': $\kappa_{\rm T}$'
-					ylabels[i][j] = "Correction"
+					ylabels[i] = "Correction"
 					if j == 0 and k == 0:
 						data_min.append(0.9)
 						data_max.append(1.1)
 			elif 'pum' in txt_list[i][j][k] or 'PUM' in txt_list[i][j][k]:
 				if 'imag' in txt_list[i][j][k] or 'IMAG' in txt_list[i][j][k]:
 					labels[i][j][k] += r': $\Im(\kappa_{\rm P})$'
-					ylabels[i][j] = "Correction"
+					ylabels[i] = "Correction"
 					if j == 0 and k == 0:
 						data_min.append(-0.1)
 						data_max.append(0.1)
 				elif 'real' in txt_list[i][j][k] or 'REAL' in txt_list[i][j][k]:
 					labels[i][j][k] += r': $\Re(\kappa_{\rm P})$'
-					ylabels[i][j] = "Correction"
+					ylabels[i] = "Correction"
 					if j == 0 and k == 0:
 						data_min.append(0.9)
 						data_max.append(1.1)
 				elif 'tau' in txt_list[i][j][k] or 'TAU' in txt_list[i][j][k]:
 					labels[i][j][k] += r': $\tau_{\rm P}$'
-					ylabels[i][j] = "Time ($\mu$s)"
+					ylabels[i] = "Time ($\mu$s)"
 					if j == 0 and k == 0:
 						data_min.append(-1000)
 						data_max.append(1000)
 				else:
 					# Assume it's the magnitude
 					labels[i][j][k] += r': $\kappa_{\rm P}$'
-					ylabels[i][j] = "Correction"
+					ylabels[i] = "Correction"
 					if j == 0 and k == 0:
 						data_min.append(0.9)
 						data_max.append(1.1)
 			elif 'uim' in txt_list[i][j][k] or 'UIM' in txt_list[i][j][k]:
 				if 'imag' in txt_list[i][j][k] or 'IMAG' in txt_list[i][j][k]:
 					labels[i][j][k] += r': $\Im(\kappa_{\rm U})$'
-					ylabels[i][j] = "Correction"
+					ylabels[i] = "Correction"
 					if j == 0 and k == 0:
 						data_min.append(-0.1)
 						data_max.append(0.1)
 				elif 'real' in txt_list[i][j][k] or 'REAL' in txt_list[i][j][k]:
 					labels[i][j][k] += r': $\Re(\kappa_{\rm U})$'
-					ylabels[i][j] = "Correction"
+					ylabels[i] = "Correction"
 					if j == 0 and k == 0:
 						data_min.append(0.9)
 						data_max.append(1.1)
 				elif 'tau' in txt_list[i][j][k] or 'TAU' in txt_list[i][j][k]:
 					labels[i][j][k] += r': $\tau_{\rm U}$'
-					ylabels[i][j] = "Time ($\mu$s)"
+					ylabels[i] = "Time ($\mu$s)"
 					if j == 0 and k == 0:
 						data_min.append(-1000)
 						data_max.append(1000)
 				else:
 					# Assume it's the magnitude
 					labels[i][j][k] += r': $\kappa_{\rm U}$'
-					ylabels[i][j] = "Correction"
+					ylabels[i] = "Correction"
 					if j == 0 and k == 0:
 						data_min.append(0.9)
 						data_max.append(1.1)
 			elif 'pu' in txt_list[i][j][k] or 'PU' in txt_list[i][j][k]:
 				if 'imag' in txt_list[i][j][k] or 'IMAG' in txt_list[i][j][k]:
 					labels[i][j][k] += r': $\Im(\kappa_{\rm PU})$'
-					ylabels[i][j] = "Correction"
+					ylabels[i] = "Correction"
 					if j == 0 and k == 0:
 						data_min.append(-0.1)
 						data_max.append(0.1)
 				elif 'real' in txt_list[i][j][k] or 'REAL' in txt_list[i][j][k]:
 					labels[i][j][k] += r': $\Re(\kappa_{\rm PU})$'
-					ylabels[i][j] = "Correction"
+					ylabels[i] = "Correction"
 					if j == 0 and k == 0:
 						data_min.append(0.9)
 						data_max.append(1.1)
 				elif 'tau' in txt_list[i][j][k] or 'TAU' in txt_list[i][j][k]:
 					labels[i][j][k] += r': $\tau_{\rm PU}$'
-					ylabels[i][j] = "Time ($\mu$s)"
+					ylabels[i] = "Time ($\mu$s)"
 					if j == 0 and k == 0:
 						data_min.append(-1000)
 						data_max.append(1000)
 				else:
 					# Assume it's the magnitude
 					labels[i][j][k] += r': $\kappa_{\rm PU}$'
-					ylabels[i][j] = "Correction"
+					ylabels[i] = "Correction"
 					if j == 0 and k == 0:
 						data_min.append(0.9)
 						data_max.append(1.1)
 			elif 'kc' in txt_list[i][j][k] or 'KC' in txt_list[i][j][k] or 'kappac' in txt_list[i][j][k] or 'KAPPAC' in txt_list[i][j][k] or 'kappa_c' in txt_list[i][j][k] or 'KAPPA_C' in txt_list[i][j][k] or 'kappa_C' in txt_list[i][j][k]:
 				labels[i][j][k] += r': $\kappa_{\rm C}$'
-				ylabels[i][j] = "Correction"
+				ylabels[i] = "Correction"
 				if j == 0 and k == 0:
 					data_min.append(0.95)
 					data_max.append(1.05)
 			elif 'fc' in txt_list[i][j][k] or 'FC' in txt_list[i][j][k] or 'f_c' in txt_list[i][j][k] or 'F_C' in txt_list[i][j][k]:
 				labels[i][j][k] += r': $f_{\rm cc}$'
-				ylabels[i][j] = "Frequency (Hz)"
+				ylabels[i] = "Frequency (Hz)"
 				if j == 0 and k == 0:
 					data_min.append(390)
 					data_max.append(450)
 			elif ('fs_over_Q' in txt_list[i][j][k] or 'FS_OVER_Q' in txt_list[i][j][k] or 'f_s_over_Q' in txt_list[i][j][k] or 'F_S_OVER_Q' in txt_list[i][j][k]):
 				labels[i][j][k] += r': $f_{\rm s} / Q$'
-				ylabels[i][j] = "Frequency (Hz)"
+				ylabels[i] = "Frequency (Hz)"
 				if j == 0 and k == 0:
 					data_min.append(-2)
 					data_max.append(0)
 			elif 'fs' in txt_list[i][j][k] or 'FS' in txt_list[i][j][k] or 'f_s' in txt_list[i][j][k] or 'F_S' in txt_list[i][j][k]:
 				labels[i][j][k] += r': $f_{\rm s}^2$'
-				ylabels[i][j] = "Square Frequency (Hz$^2$)"
+				ylabels[i] = "Square Frequency (Hz$^2$)"
 				if j == 0 and k == 0:
 					data_min.append(-10)
 					data_max.append(200)
 			elif 'Q' in txt_list[i][j][k] or 'q' in txt_list[i][j][k]:
 				labels[i][j][k] += r': $Q^{-1}$'
-				ylabels[i][j] = "Inverse Quality Factor"
+				ylabels[i] = "Inverse Quality Factor"
 				if j == 0 and k == 0:
 					data_min.append(-1)
 					data_max.append(1)
 			else:
 				labels[i][j][k] += 'TDCF'
-				ylabels[i][j] = "Correction"
+				ylabels[i] = "Correction"
 				if j == 0 and k == 0:
 					data_min.append(min(data[i][j][k][1]))
 					data_max.append(max(data[i][j][k][1]))
@@ -245,12 +244,14 @@ elif dur > 100:
 plt.figure(figsize = (18, len(data) * 6))
 for i in range(len(data)):
 	ax = plt.subplot(len(data), 1, i + 1)
+	num_legend = 0
 	for j in range(len(data[i])):
-		if ylabels[i][j] is not None:
-			plt.ylabel(ylabels[i][j])
 		for k in range(len(data[i][j])):
 			plt.plot((data[i][j][k][0] - t_start) / sec_per_t_unit, data[i][j][k][1], colors[j % 3][k % 3], linewidth = 2.0, label = labels[i][j][k])
-	leg = plt.legend(fancybox = True)
+			num_legend += 1
+	if ylabels[i] is not None:
+		plt.ylabel(ylabels[i])
+	leg = plt.legend(fancybox = True, loc = 'upper right', ncol = max(1, num_legend // 3))
 	leg.get_frame().set_alpha(0.5)
 
 	if i == 0 and options.plot_title is not None: