【问题标题】:Multiple plots lay out as upper triangle matrix and formatted as scatter plots多个图布置为上三角矩阵并格式化为散点图
【发布时间】:2016-11-30 12:02:44
【问题描述】:

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

但是,如果我能以与散点图相同的方式对图进行标题/标记,那就更好了,即我只会在顶部和右侧有标题(变量名),并通过检查每个子图的顶部和右侧都有相应的标题,人们就会知道相关参数代表什么。

这是我实现的最小示例,我只使用了 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)。

【问题讨论】:

    标签: r ggplot2 gridextra


    【解决方案1】:

    我假设您的绘图已适当安排,并且您只需要添加变量标签即可。我对绘图功能进行了一些更改以删除标题和轴标签。

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

    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)
    

    【讨论】:

      猜你喜欢
      • 2018-06-16
      • 1970-01-01
      • 2014-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 2021-12-12
      • 2017-06-17
      相关资源
      最近更新 更多