maps: foundation SPLOM + minimap, crop synthetic-haze maps to societies+steer

- plot_splom: KxK pairs-plot (mfq2 real joint only -- others ship independent-
  marginal haze that would fabricate off-diagonal correlation). lower=joint
  scatter w/ AI base->steer trajectory, diag=marginal+AI rules, upper=Pearson r
  sized by |r|. Ordered by PC1 loading so binding (authority/loyalty) cluster.
  full + AI-zoom (macro/micro). NaN-safe at collapsed poles.
- ipsative map: synthetic haze is far wider than the societies, so it now crops to
  societies+steer (haze clips) and adds a 'full space' minimap with a viewport
  rectangle -- readable big5/16pf/humor maps with macro context kept.
- compass labels via textalloc (was overlapping); NaN-safe crop.

Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
This commit is contained in:
wassname
2026-06-25 08:45:01 +08:00
co-authored by Claudypoo
parent 9b13db3390
commit a2fe33ac53
2 changed files with 174 additions and 13 deletions
+10
View File
@@ -135,6 +135,16 @@ def plot_ordinal(run_dir: Path, out: Path, name: str, vec_label: str, C: float)
paths = [T.maps.save_both(figm, out / name, "map_pca_ipsative")]
plt.close(figm)
# SPLOM only for mfq2: real per-respondent joint (others ship independent-marginal haze, whose
# off-diagonals would fabricate the correlation structure). Full + AI-zoom (macro + micro).
if name == "mfq2":
proffrac = {c: _frac(prof_c[c], instr.scale_max) for c in cs}
for zoom, tag in [(False, "splom"), (True, "splom_zoom")]:
figs = T.maps.plot_splom(instr, dims, respondents, Mfrac, _frac(base, instr.scale_max),
proffrac, zoom=zoom, vec_label=vec_label)
paths.append(T.maps.save_both(figs, out / name, tag))
plt.close(figs)
figr = T.maps.plot_range(instr, dims, cs, prof, humans, None, vec_label)
paths.append(T.maps.save_both(figr, out / name, "range"))
plt.close(figr)