ggplot2: color individual words in title

  • A+
Category:Languages

I recently saw a line chart in the Economist where the title had colored words to match the colors of the groups used in the line chart. I was wondering how to do this with a ggplot2 object. Here is some code to make a line chart with everything like the econimist article except the colored words in the title. At the bottom I show the desired output.

This question is not about theoretical ways to display this info (like directly labeling or a legend) but rather specifically about coloring individual words in titles.

data <- data.frame(     group = rep(c('affluence', 'poverty'), each = 6),     year = rep(c(1970, 1980, 1990, 2000, 2010, 2012), 2),       concentration = c(.125, .12, .14, .13, .145, .146, .068, .09, .125, .119, .13, .135) )  library(ggplot2)  ggplot(data, aes(year, concentration, color = group)) +     geom_line(size = 1.5) +     geom_point(size = 4) +     scale_y_continuous(limits = c(0, .15)) +     labs(         x = NULL, y = NULL,          title = 'Concentration of affluence and poverty nationwide'     ) +     theme_minimal() +     theme(         legend.position = 'none'     ) +     scale_color_manual(values = c('#EEB422', '#238E68')) 

ggplot2: color individual words in title


This solution is based on Displaying text below the plot generated by ggplot2 and Colorize parts of the title in a plot (credits to the contributors there!).

By using phantom placeholders for text, we avoid (most of the) hardcoding of positions.

# create text grobs, one for each color t1 <- textGrob(expression("Concentration of " * phantom(bold("affluence")) * "and" * phantom(bold("poverty")) * " nationwide"),                  x = 0.5, y = 1.1, gp = gpar(col = "black"))  t2 <- textGrob(expression(phantom("Concentration of ") * bold("affluence") * phantom(" and poverty nationwide")),                  x = 0.5, y = 1.1, gp = gpar(col = "#EEB422"))  t3 <- textGrob(expression(phantom("Concentration of affluence and ") * bold("poverty") * phantom(" nationwide")),                  x = 0.5, y = 1.1, gp = gpar(col = "#238E68"))   # plot and add grobs with annotation_custom p <- ggplot(data, aes(year, concentration, color = group)) +   geom_line(size = 1.5) +   geom_point(size = 4) +   scale_y_continuous(limits = c(0, .15)) +   labs(x = NULL, y = NULL) +   theme_minimal() +   theme(legend.position = 'none',         # add some extra margin on top         plot.margin = unit(c(4, 1, 1, 1), "lines")) +   scale_color_manual(values = c("#EEB422", "#238E68")) +   annotation_custom(grobTree(t1, t2, t3))  # create gtable and remove clipping g <- ggplot_gtable(ggplot_build(p)) g$layout$clip[g$layout$name == "panel"] <- "off"  # re-draw grid.draw(g) 

ggplot2: color individual words in title


With a larger number of colored words, the creation of the different expressions should be done more programmatically. See e.g. the nice multiTitle function in a similar question for base plot: title: words in different colors?, which should be useful in ggplot as well.

Comment

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: