一、ggplot2组图

0、安装包及示例图

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# #install.packages("devtools")
# devtools::install_github("thomasp85/patchwork")
library(ggplot2)
library(patchwork)

p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp))
p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear))
p3 <- ggplot(mtcars) + geom_bar(aes(gear)) + facet_wrap(~cyl)
p4 <- ggplot(mtcars) + geom_bar(aes(carb))
p5 <- ggplot(mtcars) + geom_violin(aes(cyl, mpg, group = cyl))

1、简单使用

(1)符号连接:+或者| 均表示左右拼接,/表示上下拼接,()可以用于调整优先级 (2)函数调用:wrap_plots(),可通过具体参数设置排列方式

1
2
p1 + p2   #左右
wrap_plots(p1, p2)
1
2
p1 / p2   #上下
wrap_plots(p1, p2, ncol = 1)

2、复杂排列

  • 符号连接方式中,可使用()调整优先级

  • 函数调用方式中,可通过design=参数设置

1
2
3
4
5
6
p1 | (p2 / p3) #先上下再左右 
#如上等价于如下
design <- "AB
           CC"
wrap_plots(A = p1, B = p2, C = p3, 
           design = design)
1
2
3
4
5
6
((p2 + p4) + plot_layout(widths = c(2, 1))) / (p1 + p3 + p5) 
#如上等价于如下
design <- "AAD
           BCE"
wrap_plots(B = p1, A = p2, C = p3, D = p4, E = p5,
           design = design)

3、细节调整

plot_layout()调整长宽比例

1
2
3
4
p1 + p2 + plot_layout(widths = c(3,2))
# wrap_plots(p1, p2) + plot_layout(widths = c(3,2))

(((p1 / p2) + plot_layout(heights = c(1,2))) | p3) + plot_layout(widths = c(2,1))

plot_layout()相同legend

1
2
3
4
5
6
7
8
data(Salaries, package="carData") 
p11 <- ggplot(Salaries, aes(x=rank, fill=sex)) +
  geom_bar(position="stack") + labs(title='position="stack"')
p22 <- ggplot(Salaries, aes(x=rank, fill=sex)) +
  geom_bar(position="dodge") + labs(title='position="dodge"')
p33 <- ggplot(Salaries, aes(x=rank, fill=sex)) +
  geom_bar(position="fill") + labs(title='position="fill"')
p11 + p22 + p33 + plot_layout(guides = 'collect')

plot_annotation() 设置标题

1
2
3
4
5
(p1 | (p2 / p3)) + plot_annotation(
  title = 'This is main title',
  subtitle = 'This is subtitle',
  caption = 'this is just caption',
  theme = theme(plot.title = element_text(hjust = 0.5)))
image-20220904201505590

plot_annotation() 设置子图tag标签

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
(p1 | (p2 / p3)) + 
  plot_annotation(tag_levels = 'A')
# tag_levels : 'a', 'A', '1', 'i, or 'I'

# tag标签加前缀
((p1 | p2) / p3) + 
  plot_annotation(tag_levels = 'A', tag_prefix = 'Fig. ') 
# tag标签加后缀
((p1 | p2) / p3) + 
  plot_annotation(tag_levels = 'A', tag_suffix = ':')

#单独子图个性化标签
p1 + labs(tag = "any")

4、ggplot与其它对象的拼图

ggplot2与表格

1
2
df = mtcars[1:10, c('mpg', 'disp')]
p1 + gridExtra::tableGrob(df)

ggplot2与基础绘图

1
p1 + ~plot(mtcars$mpg, mtcars$disp, main = 'Plot 2')

二、R基本绘图组图

仅适用于R基础绘制图形的组图

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# (1) 保存原始的默认参数
opar <- par(no.readonly=TRUE)
# (2) 声明拼图方案
par(mfcol=c(2,1)) 
# or
# layout(matrix(c(1,1,2,3),2,2,byrow=TRUE))  
# (3) 基础绘图函数绘制图形
data(mtcars)
plot(mtcars$wt, mtcars$mpg)
barplot(mtcars$mpg)

# (4) 恢复默认布局参数:一个面板一张图
par(opar)

1、par()方式

  • mfcol=c(x,y)mfrow=c(x,y)均是将初始绘图面板平均分割为x行,y列;
  • 二者区别在于前者按列的顺序依次填充、布局;而后者为按行依次填充、布局
1
2
3
4
5
6
7
opar <- par(no.readonly=TRUE)
par(mfcol=c(2,1)) #2行1列
#par(mfrow=c(2,1)) 
data(mtcars)
plot(mtcars$wt, mtcars$mpg) #图1
barplot(mtcars$mpg)         #图2
par(opar)

2、layout()精细布局

  • layout()函数的第一个参数为一个矩阵,用于设置组图位置
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
### 如下表示将三张图拼在一起:第一张图在第一行,第二、三张图在第二行
mt = matrix(c(1,1,2,3),
            nrow = 2, byrow=TRUE)
mt
#     [,1] [,2]
# [1,]    1    1
# [2,]    2    3

### 如下矩阵表示将四张图拼在一起:第一张图在第一列,第二、三张图在第二列,第四张图在第三列
mt = matrix(c(1,1,2,3,4,4),
            nrow = 2, byrow=FALSE)
mt
#       [,1] [,2] [,3]
# [1,]    1    2    4
# [2,]    1    3    4
  • widthsheights参数可进一步设置子图间的长宽比例
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
opar <- par(no.readonly=TRUE)
#布局设置
mt = matrix(c(1,1,2,3),
            nrow = 2,byrow=TRUE)
layout(mt,
       widths=c(3,1),  #高度比为 3:1
       heights=c(1,2))  #宽度比为 1:2
#绘图
plot(mtcars$wt, mtcars$mpg)
barplot(mtcars$mpg)
plot(density(mtcars$wt))
par(opar)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
opar <- par(no.readonly=TRUE)

mt = matrix(c(1,1,2,3,4,4),
            nrow = 2, byrow=FALSE)
layout(mt, 
       widths = c(2,2,1), 
       heights = c(1,2))  

plot(mtcars$wt, mtcars$mpg)
barplot(mtcars$mpg)
plot(density(mtcars$wt))
hist(mtcars$qsec)

par(opar)