2 :filename: plot_fracture_radii.py
3 :synopsis: Make plots of fracture radii for the entire network and by family. Plots of the expected analytic distributions are included in the plots for each family
5 :maintainer: Jeffrey Hyman
6 :moduleauthor: Jeffrey Hyman <jhyman@lanl.gov>
10 import matplotlib.pylab
as plt
16 """ Creates histogram plots of fracture centers in the domain. First all fractures are plotted, then by family.
21 General dictionary of output analysis code. Contains information on number of families, number of fractures, and colors.
23 families: list of fracture family dictionaries
24 Created by get_family_information
26 fractures: list of fracture dictionaries
27 Created by get_fracture_information
35 PDF files are dumped into family/figures. There is one figure for all fractures dfnGen_output_report/networks/all_fracture_centers.pdf and one per family dfnGen_output_report/family_{family_id}/family_{family_id}_fracture_centers.pdf.
42 print(
"--> Plotting Fracture Radii Distributions")
45 if fam[
"Distribution"] !=
"Constant" and fam[
"Global Family"] > 0:
46 family_id = fam[
"Global Family"]
47 dist = fam[
"Distribution"]
50 f
"--> Working on family {family_id} which has a {dist} distribution of radii."
54 if fam[
"Distribution"] ==
'Truncated Power-Law':
55 x, pdf, cdf = tpl(fam[
"Alpha"], fam[
"Minimum Radius (m)"],
56 fam[
"Maximum Radius (m)"])
58 elif fam[
"Distribution"] ==
'Lognormal':
59 x, pdf, cdf = lognormal(fam[
"Mean"], fam[
"Standard Deviation"],
60 fam[
"Minimum Radius (m)"],
61 fam[
"Maximum Radius (m)"])
63 elif fam[
"Distribution"] ==
'Exponential':
64 x, pdf, cdf = exponential(fam[
"Lambda"],
65 fam[
"Minimum Radius (m)"],
66 fam[
"Maximum Radius (m)"])
70 for i
in fam[
"fracture list - all"]:
71 radii_all.append(fractures[i][
"x-radius"])
73 for i
in fam[
"fracture list - final"]:
74 radii_accepted.append(fractures[i][
"x-radius"])
77 min_val = min(min(radii_all), min(radii_accepted))
78 max_val = max(max(radii_all), max(radii_accepted))
81 if min_radius
is None:
84 min_radius = min(min_radius, min_val)
86 if max_radius
is None:
89 max_radius = max(max_radius, max_val)
91 fig, axs = plt.subplots(nrows=2, ncols=2, figsize=(10, 7))
93 axs[0, 0].hist(radii_all,
95 color=params[
"all_color"],
96 range=(min_val, max_val),
101 label=f
"All Accepted Fractures")
105 params[
"analytic_color"],
106 label=
"Analytical PDF")
108 axs[0, 0].grid(
True, alpha=0.5)
109 axs[0, 0].set_xlabel(
"Fracture Radius [m]", fontsize=18)
110 axs[0, 0].set_ylabel(
"Density", fontsize=18)
113 axs[0, 0].set_xticklabels(axs[0, 0].get_xticks().astype(int),
116 ticks = axs[0, 0].get_yticks()
117 labels = [f
"{val:0.2f}" for val
in ticks]
118 axs[0, 0].set_yticklabels(labels, fontsize=14)
121 axs[0, 1].hist(radii_accepted,
123 color=params[
"final_color"],
124 range=(min_val, max_val),
129 label=f
"Fractures in the Connected Network")
133 params[
"analytic_color"],
134 label=
"Analytical PDF")
136 axs[0, 1].grid(
True, alpha=0.5)
137 axs[0, 1].set_xlabel(
"Fracture Radius [m]", fontsize=18)
139 axs[0, 1].set_xticklabels(axs[0, 1].get_xticks().astype(int),
142 ticks = axs[0, 1].get_yticks()
143 labels = [f
"{val:0.2f}" for val
in ticks]
144 axs[0, 1].set_yticklabels(labels, fontsize=14)
149 params[
"analytic_color"],
150 label=
"Analytical CDF")
151 y, ecdf = create_ecdf(radii_all)
154 label=
"All Fractures CDF",
155 color=params[
"all_color"])
156 y, ecdf = create_ecdf(radii_accepted)
159 label=
"Final Fractures CDF",
160 color=params[
"final_color"])
163 axs[1, 0].grid(
True, alpha=0.5)
164 axs[1, 0].set_xlabel(
"Fracture Radius [m]", fontsize=18)
165 axs[1, 0].set_ylabel(
"Cumulative Density", fontsize=18)
167 axs[1, 0].set_xticklabels(axs[1, 0].get_xticks().astype(int),
169 ticks = axs[1, 0].get_yticks()
170 labels = [f
"{val:0.2f}" for val
in ticks]
171 axs[1, 0].set_yticklabels(labels, fontsize=14)
174 axs[1, 1].set_frame_on(
False)
175 axs[1, 1].get_xaxis().set_visible(
False)
176 axs[1, 1].get_yaxis().set_visible(
False)
181 label=
"All Accepted Fractures")
184 params[
"final_color"],
186 label=
"Fractures in the Connected Network")
189 params[
"analytic_color"],
191 label=
"Analytic Value")
192 axs[1, 1].legend(loc=
"center", fontsize=18, frameon=
False)
196 fileout = f
"family_{family_id}_radii.png"
198 tmp = fam[
"Distribution"]
199 fileout = f
"family_{tmp}_radii.png"
201 if params[
"verbose"]:
202 print(f
"--> Saving File {fileout}")
203 plt.savefig(f
"{params['output_dir']}/family_{family_id}/{fileout}")
208 fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(16, 8))
210 if fam[
"Global Family"] > 0
and fam[
"Distribution"] !=
"Constant":
211 family_id = fam[
"Global Family"]
215 for i
in fam[
"fracture list - all"]:
216 radii_all.append(fractures[i][
"x-radius"])
218 for i
in fam[
"fracture list - final"]:
219 radii_accepted.append(fractures[i][
"x-radius"])
221 min_val = min(min(radii_all), min(radii_accepted))
222 max_val = max(max(radii_all), max(radii_accepted))
225 axs[0].hist(radii_all,
228 range=(min_radius, max_radius),
232 label=f
"Family \# {family_id}")
235 axs[1].hist(radii_accepted,
238 range=(min_radius, max_radius),
242 label=f
"Family \# {family_id}")
244 axs[0].grid(
True, alpha=0.5)
245 axs[0].set_title(
"All Accepted Fractures", fontsize=24)
246 axs[0].set_xlabel(
"Fracture Radius [m]", fontsize=24)
247 axs[0].set_ylabel(
"Fracture Count", fontsize=24)
248 axs[0].set_xticklabels(axs[0].get_xticks().astype(int), fontsize=14)
249 axs[0].set_yticklabels(axs[0].get_yticks().astype(int), fontsize=14)
251 axs[1].grid(
True, alpha=0.5)
252 axs[1].set_title(
"Fractures in the Connected Network", fontsize=24)
253 axs[1].set_xlabel(
"Fracture Radius [m]", fontsize=24)
254 axs[1].set_xticklabels(axs[1].get_xticks().astype(int), fontsize=14)
255 axs[1].set_yticklabels(axs[1].get_yticks().astype(int), fontsize=14)
257 axs[0].get_xlim()[0], axs[0].get_xlim()[1], axs[0].get_ylim()[0],
260 plt.savefig(f
"{params['output_dir']}/network/network_all_radii.png")
def plot_fracture_radii(params, families, fractures, num_bins=20)