ggplot: come cambiare le etichette delle sfaccettature?


Answers

Ecco una soluzione che evita di modificare i tuoi dati:

Supponiamo che la tua trama sia sfaccettata dalla parte di group del tuo dataframe, che ha il control, test1, test2 livelli control, test1, test2 , control, test1, test2 , quindi crea una lista nominata da quei valori:

hospital_names <- list(
  'Hospital#1'="Some Hospital",
  'Hospital#2'="Another Hospital",
  'Hospital#3'="Hospital Number 3",
  'Hospital#4'="The Other Hospital"
)

Quindi crea una funzione "etichettatrice" e inseriscila nella tua chiamata facet_grid:

hospital_labeller <- function(variable,value){
  return(hospital_names[value])
}

ggplot(survey,aes(x=age)) + stat_bin(aes(n=nrow(h3),y=..count../n), binwidth=10)
 + facet_grid(hospital ~ ., labeller=hospital_labeller)
 ...

Questo utilizza i livelli del frame dei dati per indicizzare l'elenco hospital_names, restituendo i valori dell'elenco (i nomi corretti).

Si noti che questo funziona solo se si ha solo una variabile di sfaccettatura. Se si dispone di due aspetti, la funzione di etichettatura deve restituire un vettore di nome diverso per ciascun aspetto. Puoi farlo con qualcosa come:

plot_labeller <- function(variable,value){
  if (variable=='facet1') {
    return(facet1_names[value])
  } else {
    return(facet2_names[value])
  }
}

Dove facet1_names e facet2_names sono elenchi predefiniti di nomi indicizzati dai nomi degli indici facet ('Hostpital # 1', ecc.).

Modifica: il metodo sopra non funziona se passi una combinazione di variabili / valori che l'etichettatrice non conosce. È possibile aggiungere un fail-safe per variabili sconosciute come questa:

plot_labeller <- function(variable,value){
  if (variable=='facet1') {
    return(facet1_names[value])
  } else if (variable=='facet2') {
    return(facet2_names[value])
  } else {
    return(as.character(value))
  }
}

Risposta adattata da come cambiare le etichette strip.text in ggplot con facet e margin = TRUE

modifica: ATTENZIONE : se stai utilizzando questo metodo per sfaccettare una colonna di caratteri , potresti ricevere etichette errate. Vedi questo bug report . corretto nelle versioni recenti di ggplot2.

Question

Ho usato il seguente comando ggplot:

ggplot(survey,aes(x=age))+stat_bin(aes(n=nrow(h3),y=..count../n), binwidth=10)
  +scale_y_continuous(formatter = "percent", breaks=c(0, 0.1, 0.2)) 
  + facet_grid(hospital ~ .) 
  + opts(panel.background = theme_blank()) 

produrre

Mi piacerebbe cambiare le etichette delle sfaccettature , tuttavia, a qualcosa di più breve (come Hosp 1, Hosp 2 ...) perché sono troppo lunghe ora e sembrano strette (aumentare l'altezza del grafico non è un'opzione, ci vorrebbe troppo spazio nel documento). Ho esaminato la pagina della guida di facet_grid ma non riesco a capire come.




Se hai due hospital e una room con due aspetti room ma vuoi rinominarne solo uno, puoi utilizzare:

facet_grid( hospital ~ room, labeller = labeller(hospital = as_labeller(hospital_names)))

Per rinominare due facet usando l'approccio vettoriale (come nella risposta di naught101), puoi fare:

facet_grid( hospital ~ room, labeller = labeller(hospital = as_labeller(hospital_names),
                                                 room = as_labeller(room_names)))



Ho un altro modo per raggiungere lo stesso obiettivo senza modificare i dati sottostanti:

ggplot(transform(survey, survey = factor(survey,
        labels = c("Hosp 1", "Hosp 2", "Hosp 3", "Hosp 4"))), aes(x = age)) +
  stat_bin(aes(n = nrow(h3),y=..count../n), binwidth = 10) +
  scale_y_continuous(formatter = "percent", breaks = c(0, 0.1, 0.2)) +
  facet_grid(hospital ~ .) +
  opts(panel.background = theme_blank())

Quello che ho fatto sopra è cambiare le etichette del fattore nel frame di dati originale, e questa è l'unica differenza rispetto al tuo codice originale.




Nota che questa soluzione non funzionerà bene nel caso in cui ggplot mostrerà meno fattori di quelli effettivamente contenuti nella tua variabile (cosa che potrebbe accadere se tu fossi stato per esempio sottoinsiemi):

 library(ggplot2)
 labeli <- function(variable, value){
  names_li <- list("versicolor"="versi", "virginica"="virg")
  return(names_li[value])
 }

 dat <- subset(iris,Species!="setosa")
 ggplot(dat, aes(Petal.Length)) + stat_bin() + facet_grid(Species ~ ., labeller=labeli)

Una soluzione semplice (oltre all'aggiunta di tutti i fattori inutilizzati in names_li, che può essere noioso) consiste nel rilasciare i fattori inutilizzati con droplevels (), nel set di dati originale o nella funzione labbeler, vedere:

labeli2 <- function(variable, value){
  value <- droplevels(value)
  names_li <- list("versicolor"="versi", "virginica"="virg")
  return(names_li[value])
}

dat <- subset(iris,Species!="setosa")
ggplot(dat, aes(Petal.Length)) + stat_bin() + facet_grid(Species ~ ., labeller=labeli2)



Penso che tutte le altre soluzioni siano davvero utili per farlo, ma c'è ancora un altro modo.

Presumo:

  • hai installato il pacchetto dplyr , che ha il comodo comando mutate , e
  • il tuo set di dati è chiamato survey .

    sondaggio%>% mutato (Hosp1 = Hospital1, Hosp2 = Hospital2, ........)

Questo comando ti aiuta a rinominare le colonne, ma tutte le altre colonne vengono mantenute.

Quindi fai lo stesso facet_wrap , ora stai bene.