Repeat one chart across groups so differences can be read on common scales.
% saying 'too little' is being spent. Dots show the estimate; whiskers show the supplied 95% confidence interval.
| Group | Wording | Estimate (%) | Lower 95% | Upper 95% | N |
|---|---|---|---|---|---|
| Democrat | Assistance to the poor | 88.52 | 84.39 | 92.64 | 429 |
| Democrat | Welfare | 51.59 | 44.91 | 58.27 | 468 |
| Independent | Assistance to the poor | 72.13 | 67.34 | 76.92 | 689 |
| Independent | Welfare | 32.69 | 27.92 | 37.46 | 707 |
| Republican | Assistance to the poor | 51.41 | 44.88 | 57.93 | 419 |
| Republican | Welfare | 16.56 | 11.62 | 21.51 | 399 |
The item labels are “Welfare” and “Assistance to the poor.” These are separate survey wording conditions, not before/after answers from the same people. Party panels omit missing party identification. No interval for the difference is inferred from the two marginal intervals.
General Social Survey · 1984–2024 · captured wording-condition estimates
Compare the same position across panels. Shared domains are essential: equal distances must mean equal changes.
Wording conditions by party, or relationships that may differ across groups.
Avoid independent panel autoscaling, tiny unreadable panels, and comparisons of incompatible quantities. Different point estimates alone do not prove a significant difference.
For estimate panels: { label, estimate, lo?, hi?, n? }[]. Group rows before rendering one ForestPlot per panel, with a common domain. ScatterRegression also supports facet and shared scales.
Omit unavailable panels with an explanation; never manufacture an interval. Null group labels must not silently become a named group.
Year and breakdown controls update all panels together. Tables retain exact values and bounds. Panels stack at narrow widths.
Install from the CTZN registry, then pass your prepared rows. Examples below illustrate the component contract.
npx shadcn add @ctzn-viz/forest-plot{groups.map(group => <ForestPlot key={group}
data={rowsByGroup[group]} domain={[0, 100]}
formatValue={{ kind: "percent", digits: 1 }}
ariaLabel={group + " spending estimates"} />)}