多个图布置为上三角矩阵并格式化为散点图

Multiple plots lay out as upper triangle matrix and formatted as scatter plots

我正在做贝叶斯建模,我有 8 个变量,每个变量都有一个相关参数,每对变量都有一个相关参数。所有这些参数都有其后验密度图。我想将这些图安排在上三角布局中,我使用了来自 Upper triangle layout

但是,如果我可以 title/label 以与散点图相同的方式绘制图表,那就更好了,即我只会在顶部和右侧显示标题(变量名),并通过查看每个子图顶部和右侧的相应标题,人们就会知道相关参数代表什么。

这是我实现的最小示例,其中我只使用了 3 个变量来进行说明。

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

所以我想要的不是明确说明相关性的含义,而是在图的顶部放置标签。我应该在顶部有标题 "variable1" 和 "variable2",在图的右侧,我有标题 "variable1" 和 "variable2" 垂直,就像散点图一样。

我想要的最终布局与此类似:

但是不同的是,我的图要求非对角线部分都是密度图,而且所有的密度图都是独立的,即数据不依赖于其他变量,如我的最小示例,我将独立的图存储在列表中(而在成对散点图中,每个子图使用一个变量作为 x,一个变量作为 y)。

我假设你已经适当地安排了你的情节,你所需要的只是添加变量标签。我对绘图函数进行了一些更改以删除标题和轴标签。

arrangeGrob returns 一个 grob 也是一个 gtable。因此,可以应用 gtable 函数来添加标签。我在下面添加了一些评论。

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)