Finished fig_invariance_full.pdf and fig_invariance_short.pdf.

Some renaming shenanigans.
This commit is contained in:
j-hartling
2026-04-29 19:04:21 +02:00
parent e70d100655
commit f6d353c5ea
15 changed files with 614 additions and 833 deletions

View File

@@ -112,6 +112,46 @@ def get_thresholds(data=None, path=None, perc=None, factor=None,
factors = data['factors'][inds]
return data['sds'] * factors, factors, data['percs'][inds, :]
def y_dist(ax, values, nbins=50, limits=None, log=False, cap=0.01, density=True,
line_kwargs={}, fill_kwargs={}):
# Get distribution:
if limits is None:
limits = np.array([np.nanmin(values), np.nanmax(values)])
limits += np.array([-1.1, 1.1]) * (limits[1] - limits[0])
if log:
limits[0] = max(limits[0], cap)
edges = np.geomspace(*limits, nbins + 1)
else:
edges = np.linspace(*limits, nbins + 1)
centers = edges[:-1] + np.diff(edges) / 2
pdf, _ = np.histogram(values, bins=edges, density=density)
# Plot distribution:
fill_handle = ax.fill_betweenx(centers, pdf.min(), pdf, **fill_kwargs)
line_handle = ax.plot(pdf, centers, **line_kwargs)[0]
ax.set_xlim(0, pdf.max() * 1.05)
return pdf, centers, line_handle, fill_handle
def x_dist(ax, values, nbins=50, limits=None, log=False, cap=0.01, density=True,
line_kwargs={}, fill_kwargs={}):
# Get distribution:
if limits is None:
limits = np.array([np.nanmin(values), np.nanmax(values)])
limits += np.array([-1.1, 1.1]) * (limits[1] - limits[0])
if log:
limits[0] = max(limits[0], cap)
edges = np.geomspace(*limits, nbins + 1)
else:
edges = np.linspace(*limits, nbins + 1)
centers = edges[:-1] + np.diff(edges) / 2
pdf, _ = np.histogram(values, bins=edges, density=density)
# Plot distribution:
fill_handle = ax.fill_between(centers, pdf.min(), pdf, **fill_kwargs)
line_handle = ax.plot(centers, pdf, **line_kwargs)[0]
ax.set_ylim(0, pdf.max() * 1.05)
return pdf, centers,line_handle, fill_handle
def get_histogram(data, edges=None, nbins=50, pad=0.1, shared=True):
if edges is None:
axis = None if shared else 0
@@ -142,12 +182,15 @@ def get_kde(data, sigma, axis=None, n=1000, pad=10):
def get_saturation(sigmoid, low=0.05, high=0.95, first=True, last=True,
condense=None):
unpack_inds = lambda inds: np.nan if inds.size == 0 else inds[-1]
if condense == 'norm' and sigmoid.ndim == 2:
sigmoid = np.linalg.norm(sigmoid, axis=1)
min_value = sigmoid[0] if first else sigmoid.min(axis=0)
max_value = sigmoid[-1] if last else sigmoid.max(axis=0)
min_value = sigmoid[0] if first else np.nanmin(sigmoid, axis=0)
max_value = sigmoid[-1] if last else np.nanmax(sigmoid, axis=0)
span = max_value - min_value
low_value = min_value + low * span
high_value = min_value + high * span
@@ -155,14 +198,14 @@ def get_saturation(sigmoid, low=0.05, high=0.95, first=True, last=True,
low_mask = sigmoid <= low_value
high_mask = sigmoid <= high_value
if sigmoid.ndim == 1:
low_ind = np.nonzero(low_mask)[0][-1]
high_ind = np.nonzero(high_mask)[0][-1]
low_ind = unpack_inds(np.nonzero(low_mask)[0])
high_ind = unpack_inds(np.nonzero(high_mask)[0])
elif condense == 'all':
low_ind = np.nonzero(low_mask.all(axis=1))[0][-1]
high_ind = np.nonzero(high_mask.all(axis=1))[0][-1]
low_ind = unpack_inds(np.nonzero(low_mask.all(axis=1))[0])
high_ind = unpack_inds(np.nonzero(high_mask.all(axis=1))[0])
else:
low_ind, high_ind = [], []
for i in range(sigmoid.shape[1]):
low_ind.append(np.nonzero(low_mask[:, i])[0][-1])
high_ind.append(np.nonzero(high_mask[:, i])[0][-1])
low_ind.append(unpack_inds(np.nonzero(low_mask[:, i])[0]))
high_ind.append(unpack_inds(np.nonzero(high_mask[:, i])[0]))
return low_ind, high_ind