2016-07-26 22 views
2

Ich mache eine Bayessche Modellierung und ich habe 8 Variablen, für jede Variable gibt es einen Korrelationsparameter, und jedes Paar von Variablen hat einen Korrelationsparameter. Alle diese Parameter haben ihre posteriore Dichtekurve. Ich mag diese Grundstücke in einem oberen Dreieck Layout anzuordnen, und ich verwenden, um das Ergebnis von Upper triangle layoutMehrere Plots sind als obere Dreiecksmatrix angeordnet und als Streudiagramme formatiert

Allerdings wäre es besser, wenn ich kann die Grundstücke in der gleichen Art und Weise wie das, was Streudiagramm tut Titel/Label, das heißt Ich werde nur Titel (Variablennamen) oben und rechts haben, und durch Überprüfen der entsprechenden Titel oben und rechts von jeder Unterfigur wissen die Leute, wofür der Korrelationsparameter steht.

Hier ist ein Minimum Beispiel, das ich erreicht habe, wo ich nur 3 Variablen zur Veranschaulichung verwendet habe.

require(ggplot2) 
corr_1 = rnorm(100) 
corr_2 = rnorm(100) 
corr_12 = rnorm(100) 
corr_list = list(corr_1, corr_2, corr_12) 
ttls = c('variance within variable 1', 
     'correlation within variable 1 & 2', 
     'variance within variable 2') 
plots = list() 
for(i in 1:3){ 
    temp_df = data.frame(x=corr_list[[i]]) 
    temp = ggplot(data=temp_df, aes(x=x)) + 
    geom_density()+ 
    ggtitle(ttls[i]) 
    plots[[i]] = temp 
} 
library(gridExtra) ## for grid.arrange() 
library(grid) 
ng <- nullGrob() 
grid.arrange(plots[[1]], plots[[2]],   
      ng, plots[[3]]) 

enter image description here

Also, was ich will, ist, anstatt explizit sagen, was die Korrelation bedeutet, der Handlung in der Top-Labels haben. Ich sollte Titel "variable1" und "variable2" oben haben, und auf der rechten Seite des Diagramms habe ich Titel "variable1" und "variable2" vertikal, genau wie die Scatter-Plots tut.

Das endgültige Layout I ist ähnlich haben möchten diese: enter image description here

Allerdings ist der Unterschied, dass die Mine Plots erfordert die Diagonal Teile alle Dichteplot zu sein, und alle Dichteplots sind unabhängig, dh die Daten hängen nicht von anderen Variablen ab, da ich in meinem Minimalbeispiel unabhängige Diagramme in einer Liste gespeichert habe (während in einem paarweisen Streudiagramm jedes Unterplot eine Variable als x, eins als y verwendet).

+1

@ Hack-R, habe ich nur hinzufügen, ein paar Details. –

Antwort

1

Ich gehe davon aus, dass Sie Ihre Plots entsprechend angeordnet haben, und dass Sie nur die Variablenlabels hinzufügen müssen. Ich habe einige Änderungen an der Plot-Funktion vorgenommen, um Titel und Achsenbeschriftungen zu entfernen.

arrangeGrob gibt einen grob, der auch ein gtable ist. Somit können gtable Funktionen angewendet werden, um die Etiketten hinzuzufügen. Ich habe unten einige Kommentare hinzugefügt.

library(ggplot2) 
library(gridExtra) 
library(grid) 
library(gtable) 

corr_1 = rnorm(100) 
corr_2 = rnorm(100) 
corr_12 = rnorm(100) 
corr_list = list(corr_1, corr_2, corr_12) 
ttls = c('variance within variable 1', 
     'correlation within variable 1 & 2', 
     'variance within variable 2') 
plots = list() 
for(i in 1:3){ 
    temp_df = data.frame(x=corr_list[[i]]) 
    temp = ggplot(data=temp_df, aes(x=x)) + 
    geom_density() + 

    theme(axis.title = element_blank()) #+ 

    # ggtitle(ttls[i]) 
    plots[[i]] = temp 
} 

ng <- nullGrob() 
gp <- arrangeGrob(plots[[1]], plots[[2]],   
      ng, plots[[3]]) 

# The gp object is a gtable; 
# thus gtable functions can be applied to add the the necessary labels 

# A list of text grobs - the labels 
vars <- list(textGrob("Variable 1"), textGrob("Variable 2")) 

# So that there is space for the labels, 
# add a row to the top of the gtable, 
# and a column to the left of the gtable. 
gp <- gtable_add_cols(gp, unit(1.5, "lines"), 0) 
gp <- gtable_add_rows(gp, unit(1.5, "lines"), 0) 

# Add the label grobs. 
# The labels on the left should be rotated; hence the edit. 
# t and l refer to cells in the gtable layout. 
# gtable_show_layout(gp) shows the layout. 
gp <- gtable_add_grob(gp, lapply(vars, editGrob, rot = 90), t = 2:3, l = 1) 
gp <- gtable_add_grob(gp, vars, t = 1, l = 2:3) 

# Draw it 
grid.newpage() 
grid.draw(gp) 

enter image description here

+0

Danke für die Antwort, das hat mir wirklich geholfen, gridExtra zu verstehen. –