this_year_label ="{group}FY{year} {metric} as of {asOf}"avg_label ="{group}FY{range} average {metric} on this day"// One icon per *kind of number*, page-wide: a count is a count whether it's// broken out by state, institute, mechanism or activity, so they all get the// same grid glyph rather than a decorative per-section one. Money gets the// payments glyph. Any Iconify name works -- the site registers <iconify-icon>// globally -- but reach for Carbon first, and only fall back to Material// Symbols' flat `-sharp` variants where Carbon has no equivalent glyph. Both// sit with the brand's flat styling where Bootstrap Icons' rounded strokes// don't.count_icon ="carbon:grid"cost_icon ="carbon:money"share_icon ="carbon:percentage"// The stat boxes fundingCurveStatBoxes() builds, iconed by what the active// metric measures. Spread into its options: {...statBoxIcons(selection.metric)}statBoxIcons = (metric) => {const icon = metric.value==="outyear"? cost_icon: metric.value==="outyear_share"? share_icon : count_icon;return { thisYearIcon: icon,avgIcon: icon };}// Box titles have far less room than the Metric control's own label, so the// share metric gets a shorter name in the boxes than on the chart.boxMetricLabel = (metric) => metric.value==="outyear_share"?"Share of Funds to Outyear": metric.label// This page shows three boxes per section: this year so far, the prior-years// average, and the % change between them. Last year's same-day figure is// dropped -- it's the one number the chart itself already reads off at a// glance, and three boxes fit one row at every width. fundingCurveStatBoxes()// emits a box per non-null field of `stats`, so removing the field is the// whole edit; nothing downstream has to know which box is which.dropLastYear = (stats) => ({ ...stats,lastYear:null })// A 3rd box: % change of "this year so far" vs. the prior-years average// above. This is a derived comparison, not a value read straight off the// data, so it's computed here rather than in gwtools -- an up arrow for a// positive change, a down arrow for a negative one. `group` should match// whatever prefix the chart's other three boxes use.pctDiffBox = (stats, group ="") => {const pct = stats.priorAvg.value? (stats.thisYear.value- stats.priorAvg.value) / stats.priorAvg.value:null;return {icon: pct ==null?"carbon:subtract": pct >=0?"carbon:arrow-up-right":"carbon:arrow-down-right",value: pct ==null?"—":formatPercent(pct),title:`${group}% change vs. average` };}
Our agency funding curves1 track the progress of federal agencies’ grantmaking activity over the fiscal year, monitoring both their compliance with Congressional appropriations laws and their actual support of their scientific missions and the research community.
For the NIH, a key metric is not only the number of awards and obligations, but the changing numbers of multiyear awards and the share of total funding they represent. Multiyear awards obligate funds for more than one year, increasing the outgoing obligations of the NIH in a year and reducing the funds available for new awards in the current fiscal year.
NIH Multiyear Funding Overview
Multiyear NIH grants set aside future budget periods’ funding as outyear commitments, obligated only when each period actually starts. Use the metric control to switch between the cumulative number of multiyear awards, the cumulative amount of outyear funding, and the cumulative share of outyear funding as a percent of total new and competitive funding.2
Code
overview_selection =fundingCurveWatch(document.getElementById("overview-widget"))// .thisYear: latest running total on record for the FY in progress now.// .lastYear: last year's running total on the SAME day of its own FY --// dropped from the boxes here (see dropLastYear above), still on the chart.// .priorAvg: mean of that same day-of-FY figure across every year <= 2024// (fixed, not "N years back" -- see fundingCurveYearStats()'s own doc).overview_stats =fundingCurveYearStats(overview_selection.rows, { valueField: overview_selection.metric.y })fundingCurveValueBoxes([...fundingCurveStatBoxes(dropLastYear(overview_stats), {formatValue:resolveValueFormat(overview_selection.metric.valueFormat),metric:boxMetricLabel(overview_selection.metric),...statBoxIcons(overview_selection.metric),thisYearLabel: this_year_label,avgLabel: avg_label }),pctDiffBox(overview_stats)], { columns:3 })