Etichette per asse variabile formatter per facet in ggplot / R

Ho un dataframe che acquisisce diverse misure nel tempo che mi piacerebbe visualizzare una sfaccettatura 3×1. Tuttavia, ogni misura contiene diverse unità / scale che trarrebbero beneficio da trasformazioni personalizzate e schemi di etichettatura.

Quindi, la mia domanda è: se le unità e le scale sono diverse tra le diverse facce, come posso specificare un formattatore personalizzato o una trasformazione (ad esempio log10) su un particolare asse all’interno di un aspetto?

Ad esempio, supponiamo di avere i dati:

df = data.frame(dollars=10^rlnorm(50,0,1), counts=rpois(50, 100)) melted.df = melt(df, measure.var=c("dollars", "counts")) 

Come si andrebbe a creare una sfaccettatura 2×1 che mostra i dollari e conta sull’indice con labels=dollars e scale_y_continuous(trans = "log10", ...) per i dati di df$dollars ?

Grazie!

Come hai scoperto, non c’è una soluzione facile a questo, ma ne esce molto. Poiché questo genere di cose viene chiesto così spesso, trovo utile spiegare perché questo è difficile e suggerire una ansible soluzione.

La mia esperienza è stata che le persone che arrivano alla grafica di ggplot2 o reticolo fondamentalmente fraintendono lo scopo della sfaccettatura (o trellising, in reticolo ). Questa funzione è stata sviluppata con un’idea ben precisa in mente: la visualizzazione dei dati su più gruppi che condividono una scala comune . Deriva da qualcosa chiamato il principio dei piccoli multipli, sposato da Tufte e altri.

Posizionare pannelli uno accanto all’altro con scale molto diverse è qualcosa che gli esperti di visual design tendono ad evitare, perché può essere nel migliore dei casi fuorviante. (Non ti sto sgridando qui, solo spiegando la logica …)

Ma ovviamente, una volta che hai questo ottimo strumento allo scoperto, non sai mai come lo useranno. Quindi viene allungato: le richieste arrivano per la capacità di consentire alle scale di variare in base al pannello e di impostare vari aspetti della trama separatamente per ciascun pannello. E così la sfaccettatura in ggplot2 è stata ampliata ben oltre il suo intento originale.

Una conseguenza di ciò è che alcune cose sono difficili da implementare semplicemente a causa dell’intento di progettazione originale della funzione. Questo è probabilmente uno di questi casi.

Ok, abbastanza spiegazione. Ecco la mia soluzione.

Il trucco qui è riconoscere che non stai tracciando grafici che condividono una scala . Per me, questo significa che non dovresti nemmeno pensare di usare la sfaccettatura. Invece, crea ogni trama separatamente e disponili insieme in un grafico:

 library(gridExtra) p1 <- ggplot(subset(melted.df,variable == 'dollars'), aes(x = value)) + facet_wrap(~variable) + geom_density() + scale_x_log10(labels = dollar_format()) p2 <- ggplot(subset(melted.df,variable == 'counts'), aes(x = value)) + facet_wrap(~variable) + geom_density() grid.arrange(p1,p2) 

inserisci la descrizione dell'immagine qui

Ho appena indovinato su quale geom_* volessi usare, e sono sicuro che non è proprio quello che volevi tracciare, ma almeno illustra il principio.