Styling charts for TASO publications

This section is designed with TASO partners and staff in mind, providing rules on chart formatting to ensure consistency across TASO outputs. That said, we anticipate that the insights provided may also be beneficial to anyone interested in developing their own data visualisation style guide, or understanding the technical details behind creating consistently formatted and distinctive charts.

A note for TASO partners

Designing charts for TASO publications has been a trial and error process, as we figure out what works for our partners. If you are a partner on a TASO project and are unsure how to design your charts, please email research@taso.org.uk

Formatting rules

Show the code
library(tidyverse)
library(extrafont)

df <- data.frame(
  X_Axis_Title = c("Category 1", "Category 2", "Category 3", "Category 4"),
  Y_Axis_Title = c(10, 20, 30, 20)
)

# Build the plot using ggplot2 package.
ggplot(df, aes(x = X_Axis_Title, y = Y_Axis_Title)) +
  # Add bar elements to the plot. 'stat = "identity"' tells ggplot to use the y-values as they are.
  geom_bar(stat = "identity", fill = "#3b66bc") +
  # Add a horizontal line at y = 0, with a solid line type and a specified color.
    geom_hline(yintercept = 0, linetype = "solid", color = "#404040") +
  # Add labels for the axes, title, subtitle, and caption. Also format these elements.
  labs(x = "Axis Title", 
       y = "", 
       title = "This is the title of the chart, it should be in Neuton, no longer than two lines,\nand normally active",
       subtitle = "This is the subtitle, it should normally be a formal statistical subtitle\n",
       caption = "Source: This is the source in italics\n\nNotes: These are the notes in italics") + 
  # Customise with TASO theme elements, including background colour, title positioning, gridlines.
  theme_minimal() + 
  theme(
          text = element_text(family = "Barlow", size = 12),
          plot.title.position = "plot",
          plot.title = element_text(family = "Neuton", size = 16),
          plot.subtitle = element_text(size = 12),
          plot.caption.position = "plot",
          plot.caption = element_text(hjust = 0, size = 9, face = "italic"),
          plot.background = element_rect(fill = "#EDEBE3", color = NA),
          plot.margin = margin(0.25, 0.25, 0.25, 0.25, "in"),
          panel.border = ggplot2::element_blank(),
          panel.grid.major = element_line(colour = "#CECABC", linewidth = 0.3), 
          panel.grid.minor = element_blank(),
          panel.background = ggplot2::element_rect(fill = "#edebe3", color = NA), 
          axis.text = element_text(size = 10),
          axis.title = element_text(size = 9),
          axis.line.y = element_blank(),
          axis.line = element_line(colour = "#485866", linewidth = 0.5),
          axis.text.x = element_text(margin = margin(t = 7, unit = "pt")), 
          axis.ticks.length = unit(0.3, "cm"), # Increase the length of ticks
          axis.ticks.x = element_line(colour = "#485866", linewidth = 0.5), 
          legend.position = "none"
    )

Bar chart with TASO stylings - putty background, Arial font, minimal gridlines. Title is largest text on the page in bold with subtitle underneath. Caption is in italics.

You can find an example R script for creating charts with TASO styling on our GitHub. R is a widely used statistical software among researchers and data analysis. You can also find useful resources for data visualisation in R in the R resources section.

  • The fonts for the charts are Neuton for the header and Barlow for all other text. Ensure that font sizes always remain readable. If there is text you must include but you are finding it is too small, consider how you can redesign the chart. For annotations and data labels, if you are to use bolding or italics, use them with purpose.

  • The title should normally be an active title that conveys the key takeaway and should always be the largest text on the page.

  • The subtitle should be a formal statistical title (as you might traditionally title a chart).

  • The caption should be in the bottom left of the chart. It should be in italics, and smaller than the rest of the text on the chart.

  • Text sizes can have some flexibility. But ensure that the title is the largest text on the page, followed by the subtitle. Ensure all other text is smaller than the title and subtitle.

  • Colours

    • The text should be black, but adjust as appropriate for readability. For example, sometimes data labels will need to be white to stand out against colours.
    • Background should be #EDEBE3 (putty).
    • Gridlines should generally be “#CECABC” (darker than the background but lighter than text and lines). Gridline shade can be adjusted if it aids readability, but it should be a shade of grey.
  • Format

    • 180mm (width) x 120mm (height) is the default standard chart size for A4 PDF reports. 180mm is the maximum width, however, the height is flexible depending on the chart. For example, if your chart needs to be tall rather than wide.

    • Different social media platforms require different image sizes.

      • For an instagram story or reel, 1080 x 1920 pixels is recommended. For carousel posts, the recommended sizes are:

        • Landscape: 1080 x 566 pixels

        • Portrait: 1080 x 1350 pixels

        • Square: 1080 x 1080 pixels

      • For in-stream photos on X, the recommended image size is 1600 x 900 pixels. The minimum size is 600 x 335 pixels.

      • For LinkedIn, the recommended image size is 1200 x 627 pixels for a blog post.

    #You can adjust the size of the image using: 
    ggsave(
       "chart.png",
       plot = chart_name,
       width = #in px,
       height = #in px,
       units = "px", #px = pixels. You can also use millimeters (mm).
       scale = 1.3   # <–– tune this until chart fills the space nicely. You may need to adjust the spacing in titles. 
    )
    • Save as a PNG or a JPEG to avoid losing quality through copy and pasting or screenshots.
  • If you are including the logo, it should be in the bottom right corner, with sufficient space around it as per the brand guidelines. The logo is not needed in PDF reports that already contain TASO branding. However, consider including the logo for web/social media versions of charts, where the chart is taken outside of the context of the report.

Adjusting charts for different publication types

A chart published in an analytical report will require a slightly different set up to a chart for a blog or a social media. To see how we have tackled this most recently, we can look at charts for TASO’s Education pathways report.

Brand colours

#07dbb3 #3b66bc #e4e2d9 #edebe3 #f9466c #485866

Note

You can use RColourBrewer to generate gradients in R. Alternatively, you can use this website to modify the brightness and colour intensity and choose the number of colours you want to generate.

Show the code
taso_one_colour <- "#3b66bc"
taso_two_colour <- c("#3b66bc", "#07dbb3")
taso_three_colour <- c("#3b66bc","#07dbb3","#f9466c")
taso_four_colour <- c("#3b66bc", "#07dbb3", "#f9466c","#485866")
taso_five_colour <- c("#3b66bc", "#07dbb3", "#f9466c","#485866","#e4e2d9")

taso_likert <- c("#f9466c", "#fea3ac", "#f1f1f1", "#9ea8d7", "#3b66bc")

Accessibility

Ensure foreground and background colours contrast enough to pass the WCAG AA standard. You can check the colour contrast here.

For more in-depth guidance on accessibility, we recommend the accessibility sections of the Government Analysis Function data visualisation guidance and the Royal Statistical Society data visualisation guide.

At TASO, we will be looking further into how we can improve the accessibility of our charts, particularly around the use of accessible colour palettes.

For alt text, Amy Cesal provides some useful guidance on how to write alt text for charts.1 She includes the following formula to help:

Chart type of type of data where reason for including chart

Alt text example

Bar chart of the average earnings of students by highest qualification where students who went to a top third university earn the most

Back to top

Footnotes

  1. Cesal, A. 2020. Writing Alt Text for Data Visualization. https://medium.com/nightingale/writing-alt-text-for-data-visualization-2a218ef43f81 [Accessed 21 November 2023]↩︎