Files
paper_2025/python/fig_temp.py
2026-04-02 16:00:56 +02:00

132 lines
4.9 KiB
Python

import glob
import numpy as np
import matplotlib.pyplot as plt
from thunderhopper.modeltools import load_data
from thunderhopper.filtertools import find_kern_specs
from misc_functions import unsort_unique
from color_functions import sample_cmap
from IPython import embed
# Settings:
target = 'Omocestus_rufipes'
data_path = glob.glob(f'../data/inv/full/{target}*.npz')[0]
stages = ['conv', 'feat']
load_kwargs = dict(
files=stages,
keywords=['scales', 'measure']
)
# Subset settings:
all_types = np.array([1, -1, 2, -2, 3, -3, 4, -4, 5, -5,
6, -6, 7, -7, 8, -8, 9, -9, 10, -10]).astype(float)
all_sigmas = np.array([0.001, 0.002, 0.004, 0.008, 0.016, 0.032])
kerns = None
types = np.array([1, -1, 2, -2, 3, -3, 4, -4, 5, -5,
6, -6, 7, -7, 8, -8, 9, -9, 10, -10])
sigmas = np.array([0.008, 0.016])
# Plot settings:
line_kwargs = dict(
linewidth=2,
)
median_kwargs = dict(
linewidth=4,
c='k',
linestyle='--'
)
# Load invariance data:
data, config = load_data(data_path, **load_kwargs)
scales = data['scales']
# Reduce to kernel subset:
if any(var is not None for var in [kerns, types, sigmas]):
subset_inds = find_kern_specs(config['k_specs'], kerns, types, sigmas)
data['measure_conv'] = data['measure_conv'][:, subset_inds]
data['measure_feat'] = data['measure_feat'][:, subset_inds]
config['kernels'] = config['kernels'][:, subset_inds]
config['k_specs'] = config['k_specs'][subset_inds, :]
kern_types = unsort_unique(config['k_specs'][:, 0])
kern_sigmas = unsort_unique(config['k_specs'][:, 1])
# Prepare colors:
type_colors = {t: c for t, c in zip(all_types, sample_cmap('turbo', all_types.size))}
sigma_colors = {s: c for s, c in zip(all_sigmas, sample_cmap('turbo', all_sigmas.size))}
# Prepare graph:
fig, axes = plt.subplots(2, 4, figsize=(16, 16), layout='constrained', sharex=True)
axes[0, 0].set_xlim(scales[0], scales[-1])
axes[0, 0].set_xscale('log')
axes[0, 0].set_ylabel('conv')
axes[1, 0].set_ylabel('feat')
# Condense across kernels:
median_conv = np.median(data['measure_conv'], axis=1)
median_feat = np.median(data['measure_feat'], axis=1)
# Coded by type:
leg_handles = []
for kern_type in kern_types:
color = type_colors[kern_type]
inds = find_kern_specs(config['k_specs'], types=kern_type)
leg_handles.append(axes[0, 0].plot(scales, data['measure_conv'][:, inds],
c=color, label=f'{kern_type}', **line_kwargs)[0])
axes[0, 0].plot(scales, median_conv, **median_kwargs)
axes[1, 0].plot(scales, data['measure_feat'][:, inds], c=color, **line_kwargs)
axes[1, 0].plot(scales, median_feat, **median_kwargs)
axes[0, 0].legend(handles=leg_handles, loc='upper left')
axes[0, 0].set_title('Coded by type')
# Coded by sigma:
leg_handles = []
for kern_sigma in kern_sigmas:
color = sigma_colors[kern_sigma]
inds = find_kern_specs(config['k_specs'], sigmas=kern_sigma)
leg_handles.append(axes[0, 1].plot(scales, data['measure_conv'][:, inds],
c=color, label=f'{kern_sigma}', **line_kwargs)[0])
axes[0, 1].plot(scales, median_conv, **median_kwargs)
axes[1, 1].plot(scales, data['measure_feat'][:, inds], c=color, **line_kwargs)
axes[1, 1].plot(scales, median_feat, **median_kwargs)
axes[0, 1].legend(handles=leg_handles, loc='upper left')
axes[0, 1].set_title('Coded by sigma')
# Normalize measures:
data['measure_conv'] -= data['measure_conv'].min(axis=0)
data['measure_conv'] /= data['measure_conv'].max(axis=0)
data['measure_feat'] -= data['measure_feat'].min(axis=0)
data['measure_feat'] /= data['measure_feat'].max(axis=0)
# Condense across kernels:
median_conv = np.median(data['measure_conv'], axis=1)
median_feat = np.median(data['measure_feat'], axis=1)
# Coded by type:
leg_handles = []
for kern_type in kern_types:
color = type_colors[kern_type]
inds = find_kern_specs(config['k_specs'], types=kern_type)
leg_handles.append(axes[0, 2].plot(scales, data['measure_conv'][:, inds],
c=color, label=f'{kern_type}', **line_kwargs)[0])
axes[0, 2].plot(scales, median_conv, **median_kwargs)
axes[1, 2].plot(scales, data['measure_feat'][:, inds], c=color, **line_kwargs)
axes[1, 2].plot(scales, median_feat, **median_kwargs)
axes[0, 2].legend(handles=leg_handles, loc='upper left')
axes[0, 2].set_title('Coded by type')
# Coded by sigma:
leg_handles = []
for kern_sigma in kern_sigmas:
color = sigma_colors[kern_sigma]
inds = find_kern_specs(config['k_specs'], sigmas=kern_sigma)
leg_handles.append(axes[0, 3].plot(scales, data['measure_conv'][:, inds],
c=color, label=f'{kern_sigma}', **line_kwargs)[0])
axes[0, 3].plot(scales, median_conv, **median_kwargs)
axes[1, 3].plot(scales, data['measure_feat'][:, inds], c=color, **line_kwargs)
axes[1, 3].plot(scales, median_feat, **median_kwargs)
axes[0, 3].legend(handles=leg_handles, loc='upper left')
axes[0, 3].set_title('Coded by sigma')
plt.show()
embed()