Case Study 1: The BBC Data Journalism Style System

The BBC's Visual and Data Journalism team produces hundreds of charts a year for a global news audience. In 2019, they released their shared chart style as open-source code — a free gift to anyone who wanted professional-quality data journalism without designing from scratch. The release is a case study in how institutional style systems are built and why they work.


The Situation

The BBC's Visual and Data Journalism (VDJ) team is one of the most respected data journalism units in the English-speaking world. They produce charts, maps, and interactive graphics for every section of the BBC's news output — politics, economics, sports, health, environment, technology, arts. The team includes journalists, designers, developers, and data analysts, and their work appears in articles, TV graphics, mobile apps, and social media posts that reach hundreds of millions of people a week.

By the late 2010s, the team had a problem. They were producing too many charts, for too many outlets, in too many contexts, and maintaining visual consistency across all of them was a daily struggle. Every journalist was, in effect, reinventing the BBC's chart style from scratch for each new project. The result was inconsistency: one chart would use one shade of blue, another would use a slightly different shade; one would have left-aligned titles, another would center them; one would format numbers with thousand separators, another would not. Individual charts were fine, but the overall body of work lacked the coherent visual identity that distinguishes institutional data journalism from scattered individual work.

The team decided to build a shared style system. The goal was to make "BBC-quality" charts the default — if you used the team's tools, your chart would inherit the BBC's visual conventions automatically. The project took months of negotiation about fonts, colors, spacing, and typography, and the result was a ggplot2-based R package called bbplot (for "BBC plot") that applied the agreed style to any ggplot2 chart. The team used bbplot for their internal work, and in 2019 they open-sourced it on GitHub under a permissive license.

The release was accompanied by a free online "cookbook" — a collection of recipes showing how to reproduce common BBC chart types using bbplot. The cookbook is now cited in data journalism courses around the world, and the bbplot style has been imitated by many other newsrooms. The broader lesson is not the specific design choices (which are matters of taste) but the institutional practice of building a shared style system and releasing it publicly.

This case study matters for Chapter 12 because it is a real-world example of the style system principle applied at scale. The BBC's ggplot2 style is the R equivalent of what you would build in matplotlib: a shared set of fonts, colors, spine treatments, typography, and export settings that make every chart consistent by default. The specific tool is R, but the lessons transfer directly to matplotlib practitioners who want to build their own equivalent.

The Design Goals

The BBC VDJ team's design goals for bbplot, based on the team's public documentation and blog posts, were:

1. Consistent across outputs. Every chart the team produced should look like it belonged to the same family. The reader should be able to recognize a BBC chart without reading the logo or the source attribution. Consistency is part of institutional credibility.

2. Readable on mobile. A large fraction of BBC readers access the site on mobile devices. Charts had to work at small sizes, with legible text and clear shapes. This constraint shaped many decisions: larger default font sizes, simpler layouts, fewer ticks.

3. Accessible. Colorblind-safe palettes, high contrast text, readable fonts. Accessibility was not an afterthought but a design requirement. The team chose colors specifically for their deuteranopia and protanopia distinguishability.

4. Compatible with the BBC's brand. The BBC has a corporate brand identity with specific font preferences, color guidelines, and design conventions. The chart style had to fit within this identity without violating it.

5. Easy to use for non-experts. Not every BBC journalist is a ggplot2 expert. The style system had to be simple enough that a reporter with basic R skills could produce a publication-quality chart without fighting the tool. This meant defaults that "just worked" for common cases.

6. Flexible for specialists. At the same time, experienced team members needed to be able to override the defaults when they had a specific requirement. The system had to provide escape hatches without punishing users for using them.

7. Maintainable as a shared codebase. The style would be updated over time as conventions evolved. Multiple team members needed to be able to contribute updates. The code had to be structured for collaborative maintenance.

These goals are not unique to the BBC. They apply to any institution that produces many charts for many audiences. The specific resolution of the goals — font choices, color palette, spine treatment — is BBC-specific, but the goals themselves are universal.

The Implementation (bbplot)

The bbplot package is small — essentially two functions and a set of default settings. The key function is bbc_style(), which applies a theme to a ggplot2 chart. In Python/matplotlib terms, this is analogous to a style function that configures every common Axes element.

The BBC style applied by bbc_style() includes:

Fonts: - Title: Helvetica, 28pt, bold. - Subtitle: Helvetica, 22pt, regular. - Axis text: Helvetica, 18pt, regular. - Caption and source: Helvetica, 15pt, regular.

The font sizes are much larger than a typical print chart because the primary use case is mobile and web, where the chart is displayed at a smaller physical size than a print page. Large fonts compensate for the smaller display.

Colors: - A curated palette of categorical colors, designed to be colorblind-safe and to match the BBC brand. - Specific accent colors for positive (blue-ish) and negative (orange-ish) data. - Gray for contextual elements and annotations. - No red (which can imply danger or error in journalism contexts where that framing is not intended).

Layout: - No x-axis title (the x-values are usually self-explanatory). - A y-axis grid only, no x-axis grid. - Grid lines in light gray, positioned behind the data. - Left-aligned title and subtitle, matching the left edge of the plotting area. - Bottom and top spines removed.

Typography discipline: - Titles are always action statements, not descriptive labels (consistent with Chapter 7). - Subtitles provide context (time range, data source, geographic scope). - Annotations use the same font family as titles, with a slightly lighter weight.

Source attribution: - Always present, in a dedicated area at the bottom of the chart. - Includes the data source and the BBC attribution.

The specific values are debatable (font sizes can be argued, color choices reflect brand constraints), but the pattern is clear: the style is a set of decisions applied uniformly to every chart. A journalist writing a chart in the BBC newsroom does not think about these decisions; they call bbc_style() and the decisions are applied automatically.

The Impact

The release of bbplot on GitHub in 2019 was covered by data journalism newsletters, trade publications, and academic programs. The repository received thousands of stars on GitHub, and the code was downloaded by practitioners around the world. The BBC's R cookbook — which shows how to reproduce specific chart types using bbplot — became a teaching resource cited in university courses on data journalism and visualization.

Beyond the direct adoption of bbplot, the release normalized the practice of newsrooms sharing their chart styles publicly. Before 2019, most newsroom chart styles were proprietary — closely guarded as part of the outlet's identity. After the BBC release, other outlets followed suit: some released their ggplot2 or matplotlib styles, others blogged about their design decisions, and the "newsroom chart style" became a legitimate topic for public discussion.

The release also influenced how institutions think about style systems more generally. The BBC team's approach — build it once, make it open, document it publicly — demonstrated that a style system does not need to be a secret competitive advantage. Sharing it builds the institution's reputation as a thoughtful practitioner, attracts collaborators, and creates a body of public work that can be referenced and improved by outsiders. The ROI of releasing is, in retrospect, large: the BBC's name is now associated with careful data journalism in part because of the visible quality of their publicly-released tooling.

Specific cross-institutional impact:

  • Reuters Graphics, The Washington Post, The Guardian, and The Economist have all cited the BBC release in their own internal style documentation.
  • Johns Hopkins University's Bloomberg School incorporated the BBC cookbook into its public health data communication course.
  • Our World in Data uses a similar style-system approach, with open-source tooling.
  • The Financial Times' data journalism team released their own visual vocabulary after the BBC release, citing the BBC as an inspiration.

The broader cultural shift: institutional chart style has moved from "proprietary house style" to "publicly documented and shared system." The BBC release was one of the earliest and most visible examples of this shift, and it continues to influence how newsrooms think about their data journalism infrastructure.

Why It Works: Principles from Chapter 12

The bbplot approach succeeds for reasons that map directly onto Chapter 12's principles.

1. The style is systematic, not ad hoc. Every chart produced with bbplot inherits the same decisions automatically. A journalist does not customize each chart; they rely on the defaults. This is the threshold concept of this chapter in action: the style system turns "make this one chart look good" into "this chart looks good by default." The result is consistency across hundreds of charts with minimal per-chart effort.

2. The customization is encapsulated in a function. bbc_style() is a callable function that applies the theme. Using it is one line; the complex logic is hidden inside. This is exactly the "reusable style function" pattern from Section 12.10. The BBC team built their function once and called it everywhere; every matplotlib practitioner can do the same with their own style.

3. The defaults embody design principles. The bbplot defaults implement specific Chapter 6, 7, and 8 principles: decluttered spines, left-aligned titles, large fonts for mobile readability, consistent colors. The defaults are not arbitrary aesthetic choices; they are a coded version of the design principles we have been building.

4. The tooling is released openly. Open sourcing the style system gives it reach beyond the BBC and makes it a teaching example. Other practitioners can inspect the code, learn from it, copy it, improve it, and cite it. This is a form of institutional generosity that pays back in reputation and community.

5. The cookbook shows specific recipes. The accompanying R cookbook demonstrates how to apply bbplot to specific chart types — line charts, bar charts, scatter plots, maps. The recipes are the "how do I reproduce this?" answer that turns the abstract style into concrete output. Matplotlib practitioners can build similar cookbooks for their own style systems, and the effort is worth it because cookbook examples are how other users learn.

6. Mobile-first sizing drives many decisions. The BBC team designed for mobile first, which means larger fonts, simpler layouts, and more whitespace than a print-first approach would produce. This is a Chapter 8 principle in action: the intended display medium shapes the design. A matplotlib practitioner working primarily on mobile-first web charts should make similar adjustments to their style system.

7. Accessibility is built in, not added on. Colorblind-safe palettes, high-contrast text, and large fonts are defaults, not exceptions. The BBC does not have to ask "is this chart accessible?" for each chart, because the default style is already accessible. This is how accessibility scales: by baking it into the style system rather than adding it chart by chart.

Complications and Criticisms

The bbplot release was praised but also critiqued. A few legitimate concerns:

The style is not universal. The BBC style reflects the BBC's brand, audience, and conventions. It is not suitable for every outlet. A scientific journal would find the BBC fonts too large. A technical documentation site might want different colors. The style is a starting point for adaptation, not a finished product to copy verbatim.

The R-specific implementation limits direct reuse. bbplot is ggplot2 code. Python practitioners can read it and learn from it, but they cannot directly import it. Each language has to reimplement the style in its native tools. This is why this case study is useful for the matplotlib chapter — the lessons transfer, but the code does not.

Documentation could be more comprehensive. The original release included a cookbook but not a deep dive into why specific decisions were made. Practitioners who wanted to understand the reasoning had to guess from the code or read the team's blog posts. Better documentation of the design rationale would have increased the educational value.

The style has aged. Font choices and color palettes that were current in 2019 have started to feel slightly dated by 2024. The BBC team has presumably updated their internal style, but the public bbplot code has not been updated correspondingly. This is a general problem with institutional style systems: they need ongoing maintenance or they become snapshot artifacts of their era.

Some BBC charts still deviate from the style. Even with bbplot available, individual BBC journalists sometimes produce charts that do not use it, for reasons ranging from deadline pressure to specific editorial requests. The existence of a style system does not guarantee uniform use of it. The team has to enforce the style system editorially, which is a cultural discipline as much as a technical one.

Lessons for Modern Practice

Most matplotlib practitioners will not work at the BBC. But the bbplot approach offers lessons for anyone building their own style system.

1. Build a shared style function and use it everywhere. The single highest-leverage decision the BBC team made was creating bbc_style() as a single callable that applied their theme. Build the matplotlib equivalent — apply_my_style(ax) or whatever you name it — and call it from every chart. Your consistency will improve immediately.

2. Document your decisions. When you make a choice (font size 11 vs. 12, left-aligned vs. centered titles), write down why. Future-you will forget the reasoning, and colleagues will want to understand the choices. Documentation is part of the style system.

3. Open source helps everyone. If you build a good style, share it. You get no competitive advantage from keeping a personal matplotlib style secret, and you help other practitioners by publishing. The BBC's open-source release had more impact than any internal-only tool could have.

4. Test on your target display. The BBC designed for mobile, and their style reflects mobile constraints. Whatever your target display is — mobile, print, slide deck, dashboard — test your style there and adjust accordingly. A style that looks good on your development monitor might look wrong on a phone.

5. Accessibility is baseline, not advanced. Build colorblind-safe palettes into your default style. Check contrast ratios for text. Use larger fonts than you think you need. Accessibility should not be an extra checklist item; it should be the default.

6. Maintain the style over time. A style system from 2019 is not a style system for 2024. Plan to revisit your choices every year or two, especially font and color decisions that can feel dated as design trends evolve. The maintenance cost is small compared to the benefit of staying current.

7. Enforce the style culturally, not just technically. Having bbc_style() available did not automatically make every BBC chart use it. The team had to establish a culture where "you use the style unless you have a reason not to" was the default expectation. For a solo practitioner, this is easier — you just commit to using your own style. For a team, it requires explicit agreement and ongoing enforcement.

8. The specific tool matters less than the principle. bbplot is ggplot2. Matplotlib practitioners can build the equivalent with style sheets and reusable functions. seaborn users can do the same. The lesson is not "use bbplot" — it is "build a style system and apply it systematically."


Discussion Questions

  1. On open-sourcing institutional style. The BBC released their internal style as open source. Is this universally a good idea, or are there legitimate reasons an institution might keep its visual style private? What are the trade-offs?

  2. On the maintenance burden. Style systems age. What should an institution do when its 2019 style starts to look dated in 2024? Update the style (and possibly break old charts) or accept that old charts look old?

  3. On the ggplot2 vs. matplotlib difference. bbplot is ggplot2-specific. Translating it to matplotlib requires reimplementing the style. Is this a fundamental limitation of language-specific styles, or could a style system be designed to transfer across languages? What would that look like?

  4. On mobile-first design. The BBC designed for mobile, which drove many specific choices. If your primary display medium is different — print, slide deck, dashboard, scientific paper — how should your style system differ?

  5. On accessibility as default. The BBC team built accessibility into the default style. Some practitioners argue that accessibility should be earned through deliberate choices, not baked in as defaults. Which approach is right, and why?

  6. On your own style system. If you were to build a personal matplotlib style system right now, what would be the first five rcParams settings you would include? Justify each choice based on the principles from Parts I and II.


The BBC's bbplot release is one of many institutional style system releases from the past decade. Each one demonstrates the same principle: build the style once, apply it systematically, share it publicly. The specific tools vary, but the approach is universal. Your matplotlib style system is smaller in scope than the BBC's, but the principles are the same: decide once, apply everywhere, document the choices, maintain over time. The BBC team made their work public so you could learn from it. Take the lesson.