Utforsk åpen tilgang per institusjon. Søk opp en institusjon for å se utviklingen over tid – tabellen og figuren speiler filtrene.
Endret
23. september 2026
Datagrunnlaget dekker kun artikler som er rapportert i NVI-sammenheng og inkluderer ikke monografier, antologier eller konferansebidrag i serier uten ISSN. Publikasjoner telles unikt per institusjon. En artikkel med forfattere fra flere institusjoner telles én gang hos hver av dem, så summen på tvers av institusjoner er høyere enn det nasjonale totaltallet. For å lese mer om utvalg og beregningsmåter, se metodebeskrivelsen.
Utforsk institusjonene
Skriv i søkefeltet for å filtrere tabellen. Velg en institusjon fra forslagslisten for også å se utviklingen over tid som figur. Tabellen viser én rad per institusjon og år innenfor valgt årsperiode, og prosentberegningen av åpen andel baseres på andelen artikler som er åpent tilgjengelige (alle kategorier unntatt deponert og lukket).
oa = (newFunction("u","return import(u)"))(newURL("assets/js/oa-chart.js",document.baseURI).href)// typed: true makes d3 coerce year/total to numbers instead of stringsinstRaw =FileAttachment("data/oa_institutions.csv").csv({typed:true})// Institution names are Norwegian proper nouns, so sort with a nb collator -// a plain sort() would put "Ås" and "Ørsta" after "Zürich" by code point.instNames = [...newSet(instRaw.map((d) => d.institution))].sort((a, b) => a.localeCompare(b,"nb"))instYearsAll = [...newSet(instRaw.map((d) => d.year))].sort((a, b) => a - b)
// Free-text search with autocomplete. The value is whatever is typed, so it// both filters the table (substring) and selects the figure (exact match).viewof instQuery = oa.comboboxInput({options: instNames,label:"Institusjon",placeholder:"Søk etter institusjon …"})
// Absolute counts vs 100 % stacked shares - drives figure, table and export.viewof instMode = Inputs.radio(newMap([["Antall","abs"], ["Prosent","pct"]]), {value:"abs",label:"Visning"})
// Custom two-ended slider; bounds follow the data, so the range extends by// itself after an annual update.viewof instYears = oa.yearRangeInput({min: instYearsAll[0],max: instYearsAll.at(-1),label:"År"})
// Disabled for now. To re-enable: move this cell back inside the// ::: {.oa-controls} block above, uncomment the input and delete the// constant - the constant holds the input's former default.// viewof instLabels = Inputs.toggle({label: "Vis verdier", value: true})instLabels =true
// Disabled for now. To re-enable: move this cell back inside the// ::: {.oa-controls} block above, uncomment the input and delete the// constant - the constant holds the input's former default.// viewof instCats = Inputs.checkbox(oa.OA_ORDER, {// value: oa.OA_ORDER,// label: "Kategorier",// format: oa.labelFor(oa.OA_LABELS)// })instCats = oa.OA_ORDER
// The figure needs one specific institution, so only an exact (case-insensitive)// name counts - a partial search term filters the table but leaves this null,// and the page shows the "pick one" hint instead of a chart.selectedInst = instNames.find((n) => n.toLowerCase() === instQuery.toLowerCase()) ??null
// No institution chosen yet -> hint text instead of an empty chartselectedInst? oa.oaChartCard(Plot, {data: instRaw.filter((d) => d.institution=== selectedInst),mode: instMode,categories: instCats,yearFrom: instYears[0],yearTo: instYears[1],showLabels: instLabels,width:Math.min(width,960),title: selectedInst,subtitle:`NVI ${instYears[0]}–${instYears[1]}` }):html`<div class="oa-hint">Velg en institusjon fra forslagslisten i søkefeltet for å se utviklingen over tid som figur.</div>`
Tabell
// The table mirrors the figure, but is not limited to the selected institution:// it lists every institution matching the search text, one row per year.// Pivots the long CSV rows (one per institution x year x status) into wide rows.instTable = {// tidy format: one row per institution + yearconst cats = oa.OA_ORDER.filter((c) => instCats.includes(c));const q = instQuery.toLowerCase();const m =newMap();for (const d of instRaw) {if (d.year< instYears[0] || d.year> instYears[1] ||!cats.includes(d.status)) continue;if (q &&!d.institution.toLowerCase().includes(q)) continue;const key =`${d.institution}|${d.year}`;if (!m.has(key)) {const row = {year: d.year,institution: d.institution};for (const c of cats) row[c] =0; m.set(key, row); } m.get(key)[d.status] += d.total; }return [...m.values()].map((r) => {// "open" = every category except closed and deposited; deposited is a// waiting room (uploaded but not yet released), so it is not open accessconst total = cats.reduce((s, c) => s + r[c],0);const open = total - (r.closed??0) - (r.deposited??0);const out = {year: r.year,institution: r.institution};for (const c of cats) { out[c] = instMode ==="pct"? (total ?Math.round((r[c] / total) *1000) /10:0): r[c]; } out.total= total; out.open_share= total ? (open / total) *100:0;return out; })// institution A-Z (Norwegian collation), then newest year first within each.sort((a, b) => a.institution.localeCompare(b.institution,"nb") || b.year- a.year);}
// Exports exactly what the table currently shows (search text, year range and// Antall/Prosent all apply). Column names are English; see oa.downloadCsv.viewof instTblDownload = Inputs.button("Last ned CSV", {label:"Eksport",reduce: () => oa.downloadCsv( instTable, [ {key:"year",header:"year"}, {key:"institution",header:"institution"},...oa.OA_ORDER.filter((c) => instCats.includes(c)).map((c) => ({key: c,header: instMode ==="pct"?`${c}_pct`: c,...(instMode ==="pct"? {value: (r) => r[c].toFixed(1).replace(".",",")}: {}) })), {key:"total",header:"total"}, {key:"open_share",header:"open_share_pct",value: (r) => r.open_share.toFixed(1).replace(".",",")}, ],`oa-barometer_institutions_${instYears[0]}-${instYears[1]}.csv` )})
// Keys stay English (they come from the data); `header` supplies the Norwegian// column names, and `format` renders each cell.Inputs.table(instTable, {columns: ["year","institution",...oa.OA_ORDER.filter((c) => instCats.includes(c)),"total","open_share"],header: {year:"år",institution:"institusjon",...Object.fromEntries(oa.OA_ORDER.map((c) => [c, oa.OA_LABELS[c]])),total:"totalt",open_share:"andel_åpen" },format: {year: (d) =>String(d),...Object.fromEntries(oa.OA_ORDER.map((c) => [ c, instMode ==="pct"? (d) =>`${oa.fmtPct1.format(d)} %`: oa.fmtNo.format ])),total: oa.fmtNo.format,open_share: (d) => oa.pctBarCell(d) },width: {year:55,institution:320,open_share:110},rows:35,layout:"auto"})
Hele datagrunnlaget aggregert til institusjonsnivå kan lastes ned her: oa_institutions.csv.