maps: respondent-haze ipsative map + glossed axes (port from mft_honesty)

plot_ipsative_pca gains an optional respondents arg: when given it fits the
ipsative PCA basis on the individual cloud (3902 Atari respondents) and scatters
them behind the society dots, with an envelope-core crop, matching the
mft_honesty fig_pca_ipsative the project standardized on. Axis labels carry a
foundation-loading gloss. respondents=None keeps the old society-only behavior.

Bundles atari_study2_raw.csv + a respondent_profiles loader (keying verbatim
from Atari Code_Study2.R) so tinymfv owns the data, no mft_honesty dependency.
plot_steer_showcase passes respondents for mfq2 only.

Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
This commit is contained in:
wassname
2026-06-24 15:49:24 +08:00
co-authored by Claudypoo
parent 9d3741fb45
commit d20f717251
3 changed files with 3980 additions and 7 deletions
+4 -1
View File
@@ -87,9 +87,12 @@ def plot_ordinal(run_dir: Path, out: Path, name: str, vec_label: str, C: float)
countries, Mfrac = human_matrix(instr)
labels = (f"base (c=0)", f"+C={C:+.2f}", f"-C={-C:+.2f}")
# mfq2 has per-respondent Atari data -> scatter the individual cloud behind the societies and
# fit the ipsative PCA on PEOPLE (better-conditioned, the real envelope). Other instruments: None.
respondents = T.maps.respondent_profiles(dims, instr.scale_max) if name == "mfq2" else None
figm = T.maps.plot_ipsative_pca(instr, dims, countries, Mfrac,
_frac(base, instr.scale_max), _frac(pos, instr.scale_max),
_frac(neg, instr.scale_max), labels=labels)
_frac(neg, instr.scale_max), respondents=respondents, labels=labels)
paths = [T.maps.save_both(figm, out / name, "map_pca_ipsative")]
plt.close(figm)