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?
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 bycyl
, 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 inmtcars
, calledLabel1
andLabel2
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 toLabel2
, 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
andLabel2
are text strings, but they're in the form of expressions so that we can uselabel_parsed
to get smaller subscripted text when we create the plot.Now we can create the plot. Facetting by
Label1
andLabel2
gives us two lines. Because we created a subscripted expression forLabel2
, this gets rendered in a smaller font when we uselabel_parsed
to label the facets. I'd prefer theLabel2
to be a bit larger, relative toLabel1
, but there's no way to control that with this (hacky) method. Also, althoughelement_text
has alineheight
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.