Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.4k views
in Technique[技术] by (71.8m points)

r - How to use different font sizes in ggplot facet wrap labels?

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
Total catch (n=133)", "Species Y
Total catch (n=185)", "Species X
Sampling area A (n=57)", "Species Y
Sampling area B (n=122)",
                             "Species X
Sampling area B (n=76)",  "Species Y
Sampling 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?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...