Shift-left for more accessibility

posit::conf(2026)

Dr. Björn Fisseler

2026-09-14

Open science means open insights, not just open data

…but whom do we leave out?

brick wall as a symbol for barriers

Dr. Björn Fisseler

  • FernUniversität in Hagen
  • Educational Technology Specialist
  • Research and Expertise
    • Accessibility Evangelist (Universal Design & Digital Inclusion)
    • Inclusive Digital Education & AI
    • Support for Learners with diverse accessibility needs
  • Reach out to bjoern.fisseler@fernuni-hagen.de

Everyone should experience our research with the same clarity and detail

  • a permanently blind person using a screen reader
  • a temporarily injured person navigating by keyboard only
  • a situationally distracted person glancing at a tablet in bright light

Retrofitting accessibility is inefficient and costly

  • It costs you time you didn’t budget for
  • It rarely matches the quality of an initial build
  • It shows — retrofits look and feel bolted-on

Wooden ramp on the backside of an old building.

“Shifting left” in the Quarto workflow closes the gap

Four principles carry every accessibility decision

  • Perceivable — can the content be received at all?
  • Operable — can it be navigated and acted on?
  • Understandable — can it be made sense of?
  • Robust — does it survive the format?

Semantic structure builds the accessible foundation everything else stands on

  • Nest headings in order: #, ##, ###
  • Let one H1 (or the YAML title) anchor the document
  • Set lang and additional attributes in your YAML header
  • Use different markdown elements for better semantic structure
---
title: "Accessible Reporting"
lang: en
author: Jane Doe
---

## Introduction

### Background

### Methods

Headings tree, from the top, Accessible Reporting, one below, Introduction, one below, Background, Methods

Small writing choices remove barriers

Write meaningful link text

  • Not: “…click here for more information.”

Keep content clear and concise

  • Short sentences and paragraphs over long, complex ones
  • Expand acronyms on first use, e.g., Web Content Accessibility Guidelines (WCAG)

Screen reader link list with five uninformative entries: here, here, click here, here, more

The same link list with descriptive entries such as information about the data source and WCAG 2.2 quick reference

Visual information is for everyone, even those who cannot see them

Choose alt text based on image type

  • Decorative → empty alt text (alt="")
  • Informative → describe the key takeaway
  • Complex (charts, diagrams) → describe the pattern, not just “a chart”

alt=“Chart type of type of data where reason for including chart” plus link to data source somewhere in the text (Cesal, 2020)

Scatterplot distinguishing three penguin species by color alone — red, green, and blue points.

Scatterplot of flipper length vs body mass across Palmer Penguins where Gentoo penguins show the largest flipper length and the highest body mass.”

But don’t rely on color alone

Make visual output accessible

  • Package defaults are rarely colorblind-safe
  • Distinguish data with color, shape, line style, or pattern
  • Consider adding the data

Scatterplot distinguishing three penguin species by color alone — red, green, and blue points.

Scatterplot includes different colors and different shapes, circles, triangles, squares, for the data points representing three penguin species.

Data
Comparing wing span vs weight
body
flipper
mass
Species
length
g
avg sd avg sd
Adelie 189.9536 6.539457 3700.662 458.5661
Chinstrap 195.8235 7.131894 3733.088 384.3351
Gentoo 217.1870 6.484976 5076.016 504.1162

Scatterplot distinguishing three penguin species by color alone — red, green, and blue points.

AI can help you write your alt text

  • Writing a good, detailed alt text by hand is slow and easy to forget
  • With a multimodal LLM, you can generate it automatically from the rendered plot
  • Use the ellmer package (or the new btw package) to connect to an LLM
generate_alt_text <- function(ggplot_obj) {
  ggsave(save_path, ggplot_obj)
  alt_text_chat <- chat_openai_compatible(base_url = "...", model = "...")
  alt_text_chat$chat("Describe this chart for someone who cannot see it...", 
                      content_image_file(save_path))
}
Scatterplot of flipper length vs. body mass across three penguin species. Gentoo penguins show the largest flipper length (210–230mm) and highest body mass (4500–6000g)..."

Structured tables transform complex data into navigable, inclusive information

| Measurement |  |  |  | Time |
| ---: | ---: | ---: | ---: | ---: |
| Ozone | Solar.R | Wind | Temp | Year |
| 41 | 190 | 7.4 | 67 | 1973 | 
| 36 | 118 | 8.0 | 72 | 1973 |
| 12 | 149 | 12.6 | 74 | 1973 |
| 18 | 313 | 11.5 | 62 | 1973 |
| NA | NA | 14.3 | 56 | 1973 |

The two-level header is faked with an extra row.

It looks right but is read as data.

gt(airquality_m) |>
  tab_header(
    title = "New York Air Quality Measurements",
    subtitle = "Daily measurements, May 1-5, 1973"
  ) |>
  tab_spanner(
    label = "Time",
    columns = c(Year, Month, Day)
  ) |>
  tab_spanner(
    label = "Measurement",
    columns = c(Ozone, Solar.R, Wind, Temp)
  ) |>
  sub_missing(missing_text = "no data")

The two-level header is a real header.

It looks the same but is read as structure.

Measurement Time
Ozone Solar.R Wind Temp Year
41 190 7.4 67 1973
36 118 8.0 72 1973
12 149 12.6 74 1973
18 313 11.5 62 1973
NA NA 14.3 56 1973

No caption, no grouping, no footnotes, no units.

Every cell reads the same.

Table 1
New York Air Quality Measurements
Daily measurements in New York City (May 1-5, 1973)
Measurement
Time
Ozone Solar.R Wind Temp Year Month Day
41 190 7.4 67 1973 5 1
36 118 8.0 72 1973 5 2
12 149 12.6 74 1973 5 3
18 313 11.5 62 1973 5 4
no data no data 14.3 56 1973 5 5

Caption, spanners, footnotes and units each have a slot.

Every cell knows which column it belongs to.

One Quarto source, many formats

Accessibility that travels as far as the format allows.

  • One single document enables multiple formats
  • Semantics and content are written once
  • Each format maps them to its own structure

Fix it once in the source, or retrofit it once per output.

Same document rendered three ways, Word in the back, PDF on second layer, HTML page in a browser in front

Small habits applied in the source make a document accessible by default

Accessibility: necessary for some, useful for everyone.

  • Structure your content
  • Take care of your visuals
  • Render the format your readers need

Ramp and stairs combined, leading to a building entrance

Openness is only complete when the results are accessible.

Shift-left on Quarto to ensure accessibility for everyone.

Take it with you