@@ -47,9 +47,14 @@ type RankingsRow = {
4747 residual : number | null ;
4848} ;
4949
50+ function positiveResidualIsGood ( target : string ) : boolean {
51+ return target !== "inequality" ;
52+ }
53+
5054function buildRankingsRows ( data : AnalyticsData ) : RankingsRow [ ] {
5155 const bundle = data . bundle ;
5256 if ( ! bundle ) return [ ] ;
57+ const positiveIsGood = positiveResidualIsGood ( data . target ) ;
5358
5459 return bundle . countries
5560 . map ( ( c ) => {
@@ -66,17 +71,28 @@ function buildRankingsRows(data: AnalyticsData): RankingsRow[] {
6671 residual,
6772 } ;
6873 } )
69- . sort ( ( a , b ) => ( b . residual ?? - 999 ) - ( a . residual ?? - 999 ) ) ;
74+ . sort ( ( a , b ) => {
75+ const ar = a . residual ?? - 999 ;
76+ const br = b . residual ?? - 999 ;
77+ return positiveIsGood ? br - ar : ar - br ;
78+ } ) ;
7079}
7180
72- function rankingsTableHtml ( rows : RankingsRow [ ] ) : string {
81+ function rankingsTableHtml ( rows : RankingsRow [ ] , target : string ) : string {
82+ const positiveIsGood = positiveResidualIsGood ( target ) ;
7383 return rows
7484 . map ( ( r , i ) => {
7585 const cls =
7686 r . residual !== null
77- ? r . residual > 0.05
78- ? "cell-positive"
87+ ? positiveIsGood
88+ ? r . residual > 0.05
89+ ? "cell-positive"
90+ : r . residual < - 0.05
91+ ? "cell-negative"
92+ : ""
7993 : r . residual < - 0.05
94+ ? "cell-positive"
95+ : r . residual > 0.05
8096 ? "cell-negative"
8197 : ""
8298 : "" ;
@@ -143,6 +159,19 @@ export function renderAnalyticsTab(data: AnalyticsData | null): string {
143159 : "" ;
144160
145161 const rankingsRows = buildRankingsRows ( data ) ;
162+ const inequalityTarget = data . target === "inequality" ;
163+ const scatterSubtitle = inequalityTarget
164+ ? "Each dot is a country in 2020. Points below the diagonal are less unequal than predicted; points above are more unequal than predicted."
165+ : `Each dot is a country in ${ decade } . Points above the diagonal beat their geography.` ;
166+ const residualHistogramSubtitle = inequalityTarget
167+ ? "Histogram of residuals (actual minus predicted). Green = less unequal than predicted, red = more unequal than predicted."
168+ : "Histogram of residuals (actual minus predicted). Green = outperforming, red = underperforming." ;
169+ const regionalSubtitle = inequalityTarget
170+ ? "Average residual by region. Negative = less unequal than predicted; positive = more unequal than predicted."
171+ : "Average residual by region. Positive = outperforms geography." ;
172+ const rankingsSubtitle = inequalityTarget
173+ ? "Click a column header to sort. Negative residual = less unequal than predicted."
174+ : "Click a column header to sort. Positive residual = beats geography." ;
146175
147176 return `
148177 <section class="analytics-hero">
@@ -173,7 +202,7 @@ export function renderAnalyticsTab(data: AnalyticsData | null): string {
173202 ${ bundle ? `
174203 <section class="analytics-section">
175204 <h2>Actual vs. predicted</h2>
176- <p class="section-subtitle">Each dot is a country in ${ decade } . Points above the diagonal beat their geography. </p>
205+ <p class="section-subtitle">${ scatterSubtitle } </p>
177206 <div class="chart-wrap chart-wrap-square">
178207 <canvas id="scatter-chart"></canvas>
179208 </div>
@@ -189,15 +218,15 @@ export function renderAnalyticsTab(data: AnalyticsData | null): string {
189218
190219 <section class="analytics-section">
191220 <h2>Distribution of luck</h2>
192- <p class="section-subtitle">Histogram of residuals (actual minus predicted). Green = outperforming, red = underperforming. </p>
221+ <p class="section-subtitle">${ residualHistogramSubtitle } </p>
193222 <div class="chart-wrap">
194223 <canvas id="residual-histogram"></canvas>
195224 </div>
196225 </section>
197226
198227 <section class="analytics-section">
199228 <h2>Regional breakdown</h2>
200- <p class="section-subtitle">Average residual by region. Positive = outperforms geography. </p>
229+ <p class="section-subtitle">${ regionalSubtitle } </p>
201230 <div class="chart-wrap chart-wrap-tall">
202231 <canvas id="regional-residual-chart"></canvas>
203232 </div>
@@ -207,7 +236,7 @@ export function renderAnalyticsTab(data: AnalyticsData | null): string {
207236 <div class="section-header-row">
208237 <div>
209238 <h2>Global rankings (${ decade } )</h2>
210- <p class="section-subtitle">Click a column header to sort. Positive residual = beats geography. </p>
239+ <p class="section-subtitle">${ rankingsSubtitle } </p>
211240 </div>
212241 <button class="export-btn" id="export-rankings-csv">Export CSV</button>
213242 </div>
@@ -223,7 +252,7 @@ export function renderAnalyticsTab(data: AnalyticsData | null): string {
223252 <th class="sortable-th active-sort" data-sort="residual">Residual \u25BE</th>
224253 </tr>
225254 </thead>
226- <tbody>${ rankingsTableHtml ( rankingsRows ) } </tbody>
255+ <tbody>${ rankingsTableHtml ( rankingsRows , data . target ) } </tbody>
227256 </table>
228257 </div>
229258 </section>
0 commit comments