Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

changing ggplot2::facet_wrap title from the default

Is there any possible way to change the labels for the facet_wrap variable, as displayed below. So, for example, instead of cyl: 4, cyl: 6, cyl: 8, I want it to read condition: 4, condition: 6, condition: 8. Of course, I can just do this by renaming the variable, but that's not what I want. This is a much simpler version of a custom function where I can't just rename a variable anyway I like.

Another way to put this is, do I have any freedom to label the facet_wrap anyway I like? Kinda like how x aesthetic variable in ggplot2 can have some name (e.g. cyl) in the dataframe (mtcars), but I can still replace it with my own name using labs(x = "cylinder")). I want to have something similar for facet_wrap.

library(dplyr)
library(datasets)
library(ggplot2)
data(mtcars)

# creating a dataframe
df <- dplyr::group_by(mtcars, .dots = c('cyl', 'am')) %>%
  dplyr::summarize(counts = n()) %>%
  dplyr::mutate(perc = (counts / sum(counts)) * 100) %>%
  dplyr::arrange(desc(perc))

# preparing the plot
ggplot2::ggplot(df, aes('', counts)) +
  geom_col(
    position = 'fill',
    color = 'black',
    width = 1,
    aes(fill = factor(am))
  ) +
  facet_wrap(~cyl, labeller = "label_both") + # faceting by `cyl` variable
  geom_label(
    aes(label = paste0(round(perc), "%"), group = factor(am)),
    position = position_fill(vjust = 0.5),
    color = 'black',
    size = 5,
    show.legend = FALSE
  ) +
  coord_polar(theta = "y")

Created on 2018-02-19 by the reprex package (v0.2.0).

like image 915
Indrajeet Patil Avatar asked Feb 19 '18 05:02

Indrajeet Patil


People also ask

How do you change the facet title in R?

Change the text of facet labels Facet labels can be modified using the option labeller , which should be a function. In the following R code, facets are labelled by combining the name of the grouping variable with group levels. The labeller function label_both is used.

What does Facet_wrap do in Ggplot?

facet_wrap() makes a long ribbon of panels (generated by any number of variables) and wraps it into 2d. This is useful if you have a single variable with many levels and want to arrange the plots in a more space efficient manner.

What is the difference between Facet_wrap and Facet_grid?

The facet_grid() function will produce a grid of plots for each combination of variables that you specify, even if some plots are empty. The facet_wrap() function will only produce plots for the combinations of variables that have values, which means it won't produce any empty plots.

How do you remove a facet title?

Facet labels text element in theme() to element_blank() . Setting strip. text to element_blank() will remove all facet labels. You can also remove the labels across rows only with strip.


2 Answers

To change the facet labels you can provide a named vector of labels to the labeller argument in facet_wrap:

labeller = labeller(cyl = 
    c("4" = "condition: 4",
      "6" = "condition: 6",
      "8" = "condition: 8"))

Here is the full plot code:

ggplot2::ggplot(df, aes('', counts)) +
  geom_col(
    position = 'fill',
    color = 'black',
    width = 1,
    aes(fill = factor(am))
  ) +
  facet_wrap(~cyl, labeller = labeller(cyl = 
    c("4" = "condition: 4",
      "6" = "condition: 6",
      "8" = "condition: 8")
  )) 
  geom_label(
    aes(label = paste0(round(perc), "%"), group = factor(am)),
    position = position_fill(vjust = 0.5),
    color = 'black',
    size = 5,
    show.legend = FALSE
  ) +
  coord_polar(theta = "y")

enter image description here

EDIT based on the comments where a function to return labels is requested:

perhaps something like this:

label_facet <- function(original_var, custom_name){
  lev <- levels(as.factor(original_var))
  lab <- paste0(custom_name, ": ", lev)
  names(lab) <- lev
  return(lab)  
}


ggplot2::ggplot(df, aes('', counts)) +
  geom_col(
    position = 'fill',
    color = 'black',
    width = 1,
    aes(fill = factor(am))
  ) +
  facet_wrap(~cyl, labeller = labeller(cyl = label_facet(df$cyl, "grouping"))) +
geom_label(
  aes(label = paste0(round(perc), "%"), group = factor(am)),
  position = position_fill(vjust = 0.5),
  color = 'black',
  size = 5,
  show.legend = FALSE
) +
  coord_polar(theta = "y")

enter image description here

sessionInfo()

R version 3.4.2 (2017-09-28)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252    LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                           LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] bindrcpp_0.2  ggplot2_2.2.1 dplyr_0.7.4   RMOA_1.0      rJava_0.9-9   RMOAjars_1.0 

loaded via a namespace (and not attached):
 [1] Rcpp_0.12.14      bindr_0.1         magrittr_1.5      munsell_0.4.3     colorspace_1.3-2  R6_2.2.2          rlang_0.1.4      
 [8] plyr_1.8.4        tools_3.4.2       grid_3.4.2        gtable_0.2.0      yaml_2.1.14       lazyeval_0.2.1    assertthat_0.2.0 
[15] digest_0.6.13     tibble_1.4.1      glue_1.2.0        labeling_0.3      compiler_3.4.2    pillar_1.0.1      scales_0.5.0.9000
[22] pkgconfig_2.0.1  
like image 97
missuse Avatar answered Sep 23 '22 07:09

missuse


You can do this:

  ggplot2::ggplot(df, aes('', counts)) +
  geom_col(
    position = 'fill',
    color = 'black',
    width = 1,
    aes(fill = factor(am))
  ) +
  facet_wrap(~cyl, labeller = as_labeller(c(`4` = "Condition: 4", `6` = "Condition: 6", `8` = "Condition: 8"))) + # faceting by `cyl` variable
  geom_label(
    aes(label = paste0(round(perc), "%"), group = factor(am)),
    position = position_fill(vjust = 0.5),
    color = 'black',
    size = 5,
    show.legend = FALSE
  ) +
  coord_polar(theta = "y")
like image 25
M_M Avatar answered Sep 25 '22 07:09

M_M