2017-02-14 13 views
11

Ich habe versucht, mit ggplot2 mehrere Grid Plots zu erzeugen. So würde Ich mag an Verteilerstück mit zusätzlichen boxplot unterhalb der x-Achse und dass für verschiedene Gruppen und Variablen wie das generieren:ggplot2 - Skalierung mehrerer Plots

Example

Code: Ich habe versucht, das zu tun, mit dem folgenden Code:

library(ggplot2) 
require(grid) 

x=rbind(data.frame(D1=rnorm(1000),Name="titi",ID=c(1:1000)), 
    data.frame(D1=rnorm(1000)+1,Name="toto",ID=c(1:1000))) 

space=1 
suite=1 
p1=ggplot(x, aes(x=D1, color=Name, fill=Name)) + 
geom_histogram(aes(y=..density..),alpha=0.35,color=adjustcolor("white",0),position="identity",binwidth = 0.05)+ 
    geom_density(alpha=.2,size=1)+ 
    theme_minimal()+ 
    labs(x=NULL,y="Density")+ 
    theme(legend.position = "top", 
     legend.title = element_blank())+ 
    scale_fill_manual(values=c("gray30","royalblue1"))+ 
    scale_color_manual(values=c("gray30","royalblue1")) 

p2=ggplot(x, aes(x=factor(Name), y=D1,fill=factor(Name),color=factor(Name)))+ 
    geom_boxplot(alpha=0.2)+ 
    theme_minimal()+ 
    coord_flip()+ 
    labs(x=NULL,y=NULL)+ 
    theme(legend.position = "none", 
     axis.text.y = element_blank(), 
     axis.text.x = element_blank(), 
     panel.grid.minor.x = element_blank(), 
     panel.grid.major.x = element_blank(), 
     panel.grid.minor.y = element_blank(), 
     panel.grid.major.y = element_blank())+ 
    scale_fill_manual(values=c("gray30","royalblue1"))+ 
    scale_color_manual(values=c("gray30","royalblue1")) 

grid.newpage() 
pushViewport(viewport(layout=grid.layout(5,1))) 
define_region <- function(row, col){ 
    viewport(layout.pos.row = row, layout.pos.col = col) 
} 
print(p1, vp=define_region(1:4,1)) 
print(p2, vp=define_region(5,1)) 

ERGEBNIS:

enter image description here

FRAGE: Während meiner Suche beobachtete ich, dass die Skala zwischen Dichteverteilung Plot und Boxplot nicht die gleichen sind (Problem 1). Ich habe keine Lösung gefunden, um diese beiden Graphen im Raster darzustellen (ich bin verloren).

+0

@Henrik Vielen Dank für Ihre Wahl. Ich habe diese Lösung bereits getestet, bin aber nicht sicher. –

+0

fügen Sie die Zeile 'p2 <-p2 + theme (plot.margin = Einheit (c (0,0.3,0,1.5)," cm "))" wird in eine Prise arbeiten. Feinabstimmung für die Boxplot-Ränder kann mit dieser Lösung erforderlich sein. Vielleicht, wenn jemand eine Möglichkeit finden kann, beide zu setzen oder die 'p1'-Ränder zu verwenden und sie' p2' anzuwenden. – N8TRO

Antwort

10

Mit dem cowplot Paket wird dies ein bisschen einfacher. Wir sollten jedoch den X-Achsenbereich richtig einstellen, um sicherzustellen, dass sie für beide Diagramme gleich sind. Dies liegt daran, dass die Dichtekurven natürlich etwas breiter sind als reine Datenzeichnungen, und die Achse für p1 wird daher etwas breiter sein. Wenn die Achsen fest sind, können wir sie anordnen und ausrichten (Achsentext und -ränder spielen keine Rolle mehr).

library(cowplot) 
comb <- plot_grid(p1 + xlim(-5, 5), 
        p2 + ylim(-5, 5),    # use ylim for p2 because of coord_flip() 
        align = 'v', rel_heights = c(4, 1), nrow = 2) 

enter image description here

Ebenso können wir ein Vielfaches der Kombination Plots anordnen:

plot_grid(comb, comb, comb, comb) 

enter image description here

+0

MAGISCH !!! Danke sehr gut @Axeman: D –

Verwandte Themen