2016-01-06 5 views
9

Ich möchte horizontale Violinplots zeichnen (weil meine Labels lang sind). Mein Design Constraints sind:horizontal ggplot2 :: geom_violin ohne coord_flip

  • mehrere Facetten (f1), mehr Kategorien pro Facette (f2) (so will ich aes(x=f2) und facet_wrap(~f1)
  • verschiedene Skalen pro Facette verwenden (so mag ich scales="free")
  • 4 verschiedene Facetten, die ich über facet_wrap() (Ausschluss einige Facettierung Tricks)

Leider scales="free" undanordnen möchten 10 sind derzeit (und auf absehbare Zeit) inkompatibel.

Die Antworten auf diese related question vorschlagen (1) hacken eine neue horizontale geom; (2) Austausch von x und y (die, wie dort erwähnt, nur mit symmetrischen Geometrien wie Streudiagrammen funktioniert); (3) aufgeben und mit dem herkömmlichen Layout gehen.

Ideen?

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") 

Meine Auswahl zu sein scheinen (1) mit scale="free", unbequem (horizontal) Etiketten:

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

enter image description here

(2) mit coord_flip(), unbequem Waage

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

enter image description here

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

ggplot2 gibt derzeit nicht frei Waage mit einer nicht-kartesischen coord oder coord_flip unterstützen.

Andere Ideen:

  • Es gibt explizit horizontale Versionen einiger GEOMS (geom_errorbarh); Ich konnte hacken meine eigene geom_violinh ...
  • Es gibt einige Diskussionen über horizontale GEOMS in einem pull request on ggplot2
  • This (rather old) example Facetten verwendet + geom_ribbon() ein Violinstück zu hacken, aber es verbraucht Facettierung, es unvereinbar mit facet_wrap()
  • machen

Für das, was es wert ist, das ist, was meine wirkliche Handlung wie (im Moment) aussieht:

enter image description here

+1

Die Frage nach Spiegeln diese stehen noch, aber würde die x-Achsenbeschriftungen drehen oder sie auf den Feldern (dh 'gsub ("\\ s +", "\ n", "unzweckmäßig lange Label")') brechen Ihrem beabsichtigten Ziel entsprechen? –

+0

Ich mag es nicht, sie zu drehen, aber ich bin vielleicht bereit, sie zu brechen oder zu kürzen ... –

Antwort

4

Nicht sicher, wenn das hilft, aber es ist eine Anpassung der this Antwort, wo wir die vertikale Violine "gehackt".

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

jetzt Dies kann mit dem neuen (Jan 2016) ggstance package, den horizontalen Versionen bietet eine Vielzahl von GEOMS erfolgen.

## 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() 
Verwandte Themen