|
|
|
|
@ -1585,22 +1585,14 @@ def build_compass_tab(db_path: str, window_size: str) -> None: |
|
|
|
|
xaxis={"range": [-1, 1]}, |
|
|
|
|
yaxis={"range": [-0.6, 0.6]}, |
|
|
|
|
) |
|
|
|
|
_add_y_direction_annotations(fig) |
|
|
|
|
|
|
|
|
|
with col1: |
|
|
|
|
st.plotly_chart(fig, use_container_width=True) |
|
|
|
|
_x_interp = axis_def.get("x_interpretation", {}).get(window_idx, "") |
|
|
|
|
_y_interp = axis_def.get("y_interpretation", {}).get(window_idx, "") |
|
|
|
|
if ( |
|
|
|
|
_x_interp |
|
|
|
|
and axis_def.get("x_quality", {}).get(window_idx, 1.0) < _THRESHOLD |
|
|
|
|
): |
|
|
|
|
st.caption(_x_interp) |
|
|
|
|
if ( |
|
|
|
|
_y_interp |
|
|
|
|
and axis_def.get("y_quality", {}).get(window_idx, 1.0) < _THRESHOLD |
|
|
|
|
): |
|
|
|
|
st.caption(_y_interp) |
|
|
|
|
|
|
|
|
|
# Voting discipline analysis |
|
|
|
|
st.markdown("---") |
|
|
|
|
@ -2678,8 +2670,17 @@ def build_svd_components_tab(db_path: str) -> None: |
|
|
|
|
if score_list |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
# Extract 1D scores for this component using aligned PCA scores |
|
|
|
|
# Extract 1D scores for this component. |
|
|
|
|
# Components 1 and 2 are literally the x and y axes of the compass (Procrustes-aligned |
|
|
|
|
# PCA via compute_2d_axes). Use _get_aligned_party_coords so the numbers are identical |
|
|
|
|
# to what the compass shows. Components 3-10 fall back to compute_nd_axes scores. |
|
|
|
|
party_1d_coords: dict = {} |
|
|
|
|
if comp_sel in (1, 2): |
|
|
|
|
coord_idx = 0 if comp_sel == 1 else 1 |
|
|
|
|
aligned_2d = _get_aligned_party_coords(svd_window) |
|
|
|
|
for party, xy in aligned_2d.items(): |
|
|
|
|
party_1d_coords[party] = (float(xy[coord_idx]),) |
|
|
|
|
else: |
|
|
|
|
aligned_all_scores = _get_aligned_party_scores(svd_window) |
|
|
|
|
for party, all_scores in aligned_all_scores.items(): |
|
|
|
|
idx = comp_sel - 1 # 0-indexed |
|
|
|
|
|