2016-01-06 15 views
9

Voglio disegnare trame di violino orizzontale (perché le mie etichette sono lunghe). I miei vincoli di progettazione sono:horizontal ggplot2 :: geom_violin senza coord_flip

  • molteplici sfaccettature (f1), categorie multiple per ogni sfaccettatura (f2) (quindi voglio usare aes(x=f2) e facet_wrap(~f1)
  • diverse scale per sfaccettatura (quindi voglio scales="free")
  • 4 diverse sfaccettature che voglio organizzare tramite facet_wrap() (che escludono alcuni trucchi sfaccettatura)

Purtroppo scales="free" e coord_flip() sono attualmente (e per il prossimo futuro) incompatibili.

Le risposte a questo related question suggeriscono (1) l'hacking di una nuova geom orizzontale; (2) scambiare x e (che come indicato qui funziona solo con geomi simmetrici come i grafici a dispersione); (3) rinunciare e andare con il layout convenzionale.

Idee?

set.seed(101) 
library("plyr") 
dd <- expand.grid(f1=factor(1:2), 
    f2=paste("inconveniently long label",1:2)) 
dd2 <- ddply(dd,c("f1","f2"), 
      function(x) 
       data.frame(y=rnorm(100, 
         mean=10*(as.numeric(x$f2)), 
         sd=10^(as.numeric(x$f1))))) 
library("ggplot2") 

Le mie scelte sembrano essere (1) con scale="free", scomodi (orizzontali) Etichette:

ggplot(dd2,aes(x=f2,y=y))+facet_wrap(~f1,scale="free")+geom_violin() 

enter image description here

(2) con coord_flip(), scale scomode

ggplot(dd2,aes(x=f2,y=y))+facet_wrap(~f1)+geom_violin()+coord_flip() 

enter image description here

Cercando entrambi (ggplot(dd2,aes(x=f2,y=y))+facet_wrap(~f1,scale="free")+geom_violin()+coord_flip()) dà

ggplot2 attualmente non supporta scale gratis con un coord non cartesiano o coord_flip.

Altre idee:

  • Non ci sono versioni orizzontali in modo esplicito di alcuni GEOMs (geom_errorbarh); Ho potuto incidere il mio geom_violinh ...
  • V'è una certa discussione GEOMs orizzontali in un pull request on ggplot2
  • This (rather old) example utilizza sfaccettature + geom_ribbon() per incidere una trama violino, ma consuma sfaccettature, che lo rende incompatibile con facet_wrap()

Per quel che vale, questo è ciò che la mia vera trama sembra (al momento):

enter image description here

+1

La domanda di lanciare questi si trova ancora, ma sarebbe ruotare le etichette degli assi x o romperle su spazi (vale a dire, 'gsub ("\\ s +", "\ n", "sconvenientemente lungo etichetta")') soddisfare il tuo obiettivo previsto? –

+0

Non mi piace ruotarli ma potrei essere disposto a rompere o abbreviare loro ... –

risposta

4
Non

certo se questo aiuta, ma è un adattamento della risposta this in cui abbiamo "hackerato" il violino verticale.

dd2_violin <- ddply(dd2,.(f1,f2),function(chunk){ 
    d_y <- density(chunk$y) 
    top_part <- data.frame(x=d_y$x, y=d_y$y) 
    bottom_part <- top_part[nrow(top_part):1,] 
    bottom_part$y <- 0 - bottom_part$y 
    return(rbind(top_part,bottom_part)) 
}) 
#weird trick to get spacing right 
dd2_violin$y2 <- as.numeric(dd2_violin$f2)*(2*max(dd2_violin$y))+dd2_violin$y 

p1 <- ggplot(dd2_violin, aes(x=x,y=y2,group=interaction(f1,f2))) + geom_path() 
#apply same weird trick to get labels 

p1 + facet_grid(~f1,scales="free")+labs(x="y")+ 
scale_y_continuous(breaks=unique(as.numeric(dd2_violin$f2)*(2*max(dd2_violin$y))),labels=unique(dd2_violin$f2)) 

enter image description here

4

Questo può ora essere fatto con il nuovo (gennaio 2016) ggstance package, che fornisce le versioni orizzontali di una varietà di GEOMs.

## if necessary 
devtools::install_github("lionel-/ggstance") 
## ... data generation stuff from above 
require("ggplot2") 
require("ggstance") 
ggplot(dd2,aes(y=f2,x=y))+facet_wrap(~f1,scale="free")+ 
    geom_violinh() 
Problemi correlati