How to use different font sizes in ggplot facet wrap labels?
Asked Answered
P

2

12

I want to create two different sizes of text in the labels of my facet wrap.

For example:

  • Species X (size 14)
  • Total catch (n=133) (size 12)

test <- read.csv(paste0(path, "Costello Artvgl2 for Stack.csv"), sep = ";", dec = ",", header = T)

str(test)


test$Wert <- factor(test$Wert, levels = c("one","two","three","four","five","six")) 


test$Sampling.site <- factor(test$Sampling.site, levels = c("Species X Area T","Species Y Area T","Species X Area A","Species Y Area B","Species X Area B","Species Y Area C"))


levels(test$Sampling.site) <-  c("Species X\nTotal catch (n=133)", "Species Y\nTotal catch (n=185)", "Species X\nSampling area A (n=57)", "Species Y\nSampling area B (n=122)",
                             "Species X\nSampling area B (n=76)",  "Species Y\nSampling area C (n=63)")

theme_new <- function(base_size = 12, base_family = base_family){
theme_bw(base_size = base_size) %+replace%
theme(
  axis.text.x =       element_text(size = 8 ),
  axis.text.y =       element_text(size = 8 ),
  axis.title.x =        element_text(size = 12, vjust = 0.01),
  axis.title.y =        element_text(size = 12, vjust = 0.9, angle = 90),

  plot.title =        element_text(size = 10, face = "bold"),

  legend.key=         element_rect(colour= NA, fill =NA, size = 0.5),
  legend.key.size =   unit(1, "lines"),
  legend.text =       element_text(size = 8),
  legend.title =      element_blank(),

  strip.background =  element_rect(fill = NA, colour = NA), 
  strip.text =        element_text(size = 8, face = "bold",hjust = 0.5, vjust = 0.9),

  panel.background =  element_rect(fill = "white"), 
  panel.border =      element_rect(fill = NA, colour="black"), 
  panel.grid.major =  element_blank(),
  panel.grid.minor =  element_blank(),
  panel.margin =      unit(1, "lines")

)
}

ggplot(test, aes(Fi, Pi),group=Wert)+
geom_point(aes(colour = factor(Wert),shape = factor(Wert)),size=3)      +                         
  scale_shape_manual(values=c(20,18,19,15,16,17))+                    
  scale_x_continuous(limits=c(0, 1),breaks=c(0,0.2,0.4,0.6,0.8,1.0))+     
  scale_colour_brewer(type = "qual", palette = "Paired")+
  scale_y_continuous(limits=c(0, 100),breaks=c(0,20,40,60,80,100))+        
  labs(x = "Frequency of occurrence", y = "Prey-specific abundance [%]")+ 
  facet_wrap(~Sampling.site,scales = "free",ncol = 2) +
  theme_new()

Is there a possibility to realize that?

Pirog answered 31/3, 2016 at 13:10 Comment(4)
This is a good question, but you may consider making your example minimal and reproducible. E.g. adapt one of the examples from the documentation.Numerable
How can I upload an excel file, so you can reproduce the code?Pirog
Please don't. Your question is not tied to your specific data, nor is most of the code in your question relevant. Make a simple example that illustrates your problem with minimal effort for the answer-er. Again, simply using one of the examples from the documentation is a straight-forward way of making a super simple example. Keep in mind that questions should be useful for future readers, too. See here for some more tips.Numerable
@PapaLuzie Given that the new ggtext package easily solves this problem, I suggest accepting Claus Wilke's new answer, rather than mine.Alaric
A
10

The solution below is a hack in that it uses a superscript (or subscript) to get a smaller font size for the second line of the facet label. I'm not sure how to get finer control of the label size without resorting to direct manipulation of the strip grobs, though there might be a way to write a labeller function to do it.

We'll use the built-in mtcars data frame for the example. First, we'll add columns that will be used both for facetting and labeling. We'll facet by cyl, but we want the first line of the label to display the number of cylinders for that facet and the second line to display the number of data points in that facet. To do this, we'll create two new columns in mtcars, called Label1 and Label2 that we'll use to create each line of the facet label. We'll facet by these two columns to get the labels we want in the graph. (Label3 is similar to Label2, but uses subscript instead of superscript; this only matters if you want to change the distance from the bottom of the second line to the top of the plot panel.)

Label1 and Label2 are text strings, but they're in the form of expressions so that we can use label_parsed to get smaller subscripted text when we create the plot.

library(ggplot2)
library(dplyr)
library(grid)

mtcars.new = mtcars %>% group_by(cyl) %>% 
  summarise(Label1=paste0("bold(Cylinders:~", unique(cyl),")"),
            Label2=paste0("bold(NULL[Count:~", length(cyl),"])"),
            Label3=paste0("bold(NULL^{Count:~", length(cyl),"})")) %>%
  full_join(mtcars)

Now we can create the plot. Facetting by Label1 and Label2 gives us two lines. Because we created a subscripted expression for Label2, this gets rendered in a smaller font when we use label_parsed to label the facets. I'd prefer the Label2 to be a bit larger, relative to Label1, but there's no way to control that with this (hacky) method. Also, although element_text has a lineheight argument, ggplot doesn't seem to be respecting it. As a result, I've manually reset the lineheight for the strip labels to reduce the space between the two labels.

p = ggplot(mtcars.new, aes(wt, mpg)) +
  geom_point() +
  facet_grid(. ~ Label1 + Label2, labeller=label_parsed) +
  theme_bw() +
  theme(strip.background=element_rect(fill=NA, color=NA),
        strip.text=element_text(size=12))

g <- ggplotGrob(p)
g$heights[[3]] = unit(0.5,"lines")

grid.draw(g)

enter image description here

Alaric answered 31/3, 2016 at 17:0 Comment(0)
K
4

The ggtext package currently under development provides a more elegant solution to this problem. It supports a small set of HTML tags that can be used to style parts of the text label.

Note: installing the development version of ggtext may pull in the development version of ggplot2.

library(tidyverse)
library(ggtext) # remotes::install_github("clauswilke/ggtext")
library(glue)
#> 
#> Attaching package: 'glue'
#> The following object is masked from 'package:dplyr':
#> 
#>     collapse

count(mtcars, cyl)  %>% 
  mutate(
    cyl_lab = as.character(
      glue("Cylinders: {cyl}<br><span style='font-size:9pt'>Count: {n}</span>")
    )
  ) %>%
  full_join(mtcars) %>%
  ggplot(aes(wt, mpg)) +
  geom_point() +
  facet_grid(. ~ cyl_lab) +
  theme_bw(12) +
  theme(strip.background=element_rect(fill=NA, color=NA),
        strip.text=element_markdown(size = 12, lineheight = 1.1))
#> Joining, by = "cyl"

Created on 2020-01-07 by the reprex package (v0.3.0)

Kherson answered 7/1, 2020 at 18:13 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.