多个图布置为上三角矩阵并格式化为散点图
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)
我正在做贝叶斯建模,我有 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)