Designing for Accessibility, Improving Charts for Everyone

Google Cloud’s first dedicated data visualization team, founded in 2018, had a mission: make data accessible to everyone. Their work on Material Design’s data visualization guidelines was well known, but an internal realization soon emerged — their own visualizations were not as inclusive as they should be. Rather than treating accessibility as a final compliance check, the team made it the starting point." And that decision led to a surprising discovery: the most accessible chart was also the most effective one.

Why Data Visualization Has an Accessibility Problem

Charts are inherently visual, which makes them inaccessible by design to a large segment of the population. Nearly 7.6 million people in the US alone have a vision disability, and color blindness affects one in twelve men worldwide. Many of these people don't use screen readers — they simply encounter a chart that fails to convey its value. When a visualization can't deliver key insights to these users, it has failed in its primary purpose.

An Architectural Comparison for Inclusive Design

The principle behind the team's approach mirrors Frank Lloyd Wright's design for the Guggenheim Museum in New York City. Visitors traverse a wide, spiral ramp to view exhibits — the accessible path is the main path. Everyone uses it. No one has to search for a hidden elevator or a retrofitted entrance at the back. Accessibility itself is the core experience, not an afterthought.

A ramp that spirals down through the various levels of the building
A view of the Guggenheim Museum’s iconic interior spiral ramp and atrium. (Image credit: Evan-Amos) (Large preview)

The same logic, the team reasoned, should apply to chart design. The accessible solution should be the chart itself, not an appended alternative or a simplified text description.

A Concrete Problem: Visualizing Code Performance

The team was asked to create a tool to help developers diagnose performance issues in their apps. The goal was to show the execution time of each function over many runs, allowing developers to identify which pieces of code were slow or unreliable. A chart needed to show a distribution of execution times for every function, and it needed to do so with at-a-glance clarity.

Initial explorations used dot plots and strip plots of individual execution times:

Execution times for a sample function plotted on a graph
Execution times for a sample function plotted on a graph. (Large preview)

After enough runs, the shape of the data would clearly show how performant a function was:

Execution times for a sample function plotted on a graph with the visulaization of the overall performance
When times are plotted on a graph, we can get a sense of the performance of a function. (Large preview)

The first viable candidate was a histogram, which offers a more scalable solution for large volumes of data:

Example histogram chart showing execution times recorded for a function
Example histogram chart showing execution times recorded for a function. (Large preview)

Applying the WCAG Constraints at the Start

With the Web Content Accessibility Guidelines (WCAG) in mind, the team evaluated the histogram against several specific constraints.

Zooming In for Low-Vision Users

The visualization had to provide value at 200% zoom, which dramatically limits how much screen real estate it should occupy. When a histogram is scaled down for such a view, the height of each bar becomes nearly impossible to compare against the Y-axis, which stays compressed:

Example of histogram chart with the compressed Y-axis. The values represented by the highlighted bars are difficult to compare to each other
Example of histogram chart with compressed Y axis. The values represented by the highlighted bars are difficult to compare to each other. (Large preview)

It gets even harder when you want to compare the performance of multiple functions with side-by-side histograms. The differences between bars become nearly impossible to read:

Example of stacked histograms. The values represented by the highlighted bars are difficult to compare
Example of stacked histograms. The values represented by the highlighted bars are difficult to compare to each other. (Large preview)

The histogram was quickly eliminated as a viable option.

The next consideration was a heatmap, which could stack execution times as horizontal swimlanes. Each lane could represent repeated runs of a single function, with colors mapping to run times:

Example heatmap
Example heatmap. (Large preview)

Color Contrast Without the Junk

WCAG requires a minimum 3:1 contrast ratio against the background for graphics. On a white background, this drastically limits the available color palette. The team chose to group execution times into five discrete ranges, referred to as "bins," rather than trying to map an infinite range of times to a continuous color scale:

A comparison of a continuous palette and discrete sequential palette. (Large preview)

To comply with the 3:1 rule while still using these binned colors, the design added whitespace around each tile, preventing adjacent tiles from meeting the contrast threshold with *each other*:

Example heatmap with a high contrast color palette
Example heatmap with a high contrast color palette. (Large preview)

While compliant, this version was harder to read and visually demanding, drawing attention away from important alerts and warnings in the overall interface.

A Second Encoding for Colorblind Users

WCAG also mandates that color cannot be the only way to convey meaning. One option is to add icons or textures, but user testing across multiple studies revealed these additions are often misunderstood as indicating separate datasets or unique statuses. They added noise, not clarity. The team instead looked for a more effective secondary encoding. Using the discrete five-bin structure, they realized they could represent each bin with its own box height. Binning the value ranges gave absolute control over the height variations, making comparison between boxes straightforward:

Chart legend demonstrates the use of box height to represent a value range
Chart legend that demonstrates the use of box height to represent a value range. (Large preview)
Visualization demonstrates the use of box height to represent a value range
Visualization that demonstrates the use of box height to represent a value range. (Large preview)

This added a second, non-color-based encoding to the chart which made it readable even without the color shades.

Circumventing the Contrast Constraint With End Caps

With the secondary encoding in place, the team returned to the question of color. They wanted a broader range of shades to make the chart more visually appealing, but each shade still had to meet the 3:1 contrast ratio against its white background — a strict limitation. The workaround was to add end caps to the top and bottom of each box. With a 3px thickness that achieves a 4.5:1 contrast ratio, these caps do the heavy lifting for accessibility. With darker accents anchoring the box edges, the chart complies with guidelines, but the interior fill could use lighter, more expressive shades that wouldn't meet the contrast requirement on their own:

Examples of using end caps to mark the tops and bottoms of blocks
Examples of using end caps to mark the tops and bottoms of blocks. (Large preview)
Example of end caps applied to the visualization
Example of end caps applied to the visualization. (Large preview)

This approach simultaneously creates a more appealing visual and ensures the chart is readable for low-vision and colorblind users.

The Result: A New, Better Chart

The final result functions as a fusion of a histogram and heatmap, which the team calls a heat lane. It represents two dimensions: time and number of events — via binned ranges for both:

Sample heat lane visualization
Sample heat lane visualization. (Large preview)

Why Is It Better for Full-Sighted Users?

The design also leverages a human cognitive trait known as pre-attentive processing. This is our evolutionary ability to spot something visually interesting in our environment almost instantly, such as spotting moldy produce in a basket:

A visual comparison of a fresh apple and rotten apple.
A visual comparison of a fresh apple and rotten apple. (Large preview)

Heat lanes exploit this same power of pattern recognition. By looking at the chart, a developer can instantly spot what's a slow, concerning section without a detailed inspection of axis values. Even when the chart is blurred or squinted at — two common tests the team used — the most important trends and outliers remain visible. The accessible features did not create visual 'chartjunk' but instead became its essential visual design.

A Chart With Endless Options

The heat lane approach is flexible. Multiple lanes can be stacked on top of one another, making it immediately clear and easy to compare event times across different event types in the call stack:

Visualization of measuring the performance of three functions through stacked heat lanes
Measuring the performance of three functions through stacked heat lanes. (Large preview)

It’s also readable when reduced to the size of a sparkline:

Heat lane reduced to a sparkline
Heat lane reduced to a sparkline. (Large preview)

The design scales effectively as a small multiple, making it possible to scan an entire matrix of functions at once:

The heat lane working as a set of small multiples in a scorecard
The heat lane working as a set of small multiples in a scorecard. (Large preview)

The heat lane handles sparse datasets of just a few data points and heavy data sets with millions of points with equal grace, making it a versatile option for detailed performance monitoring and an accessible visual style achieved by not compromising on its design.

Why Accessibility Up Front Pays Off

Had accessibility requirements been an afterthought, the team would likely have settled for a generic heatmap or histogram — and never considered merging the two. That combination is what makes the final visualization more scalable and glanceable for a broader audience. The lesson mirrors the mobile-first shift in product design: by constraining ourselves to accessible patterns first, we often arrive at genuinely better representations of data that surface more insight for everyone.

Beyond the Visuals

The visual layer is only one part of accessibility. The team has been rethinking data visualization end-to-end so that the information is reachable regardless of a person’s ability. Concretely, that means structuring charts so they can be navigated by keyboard for users with limited motor skills.

During chart construction, the team follows the Accessible Rich Internet Applications (ARIA) specification using the appropriate roles, landmarks, and attributes so a browser’s screen reader can interpret every chart element correctly. They are also exploring text-based approaches to call out trends, spikes, dips, and outliers. In select cases, sonification and audio summaries are being tested to reveal insights within the data without requiring sight.

Getting Started

For those beginning to factor accessibility into their data work, the following resources are useful launching points:

The effort was a collective one: Sierra Seeborn, Jess Klos, Nicholas Cottrell, and Saurabh Kumar each contributed to the design, development, and deployment of this visualization.

Further Reading