在同一页面上安排多张ggplot2图片时,普通的标准R函数par()和layout已经不能使用。

目前基本的解决办法是使用名叫ggExtra的R包,它包含以下功能:grid.arrange()和arrangeGrob()可以在一个页面上排列多个ggplots

marrangeGrob()可用于在多个页面上排列多个ggplots

但是,这些功能不会尝试对齐绘图面板; 相反,这些图只是简单地放置在网格中,因此轴不对齐。

因此我们可以使用ggpubr包提供的ggarrange()函数来实现多个ggplot图画的排布,并且提供统一的共同图例。

创建图片

使用演示数据集 ToothGrowth 和 mtcars创建多个图形:1

2

3

4

5

6

7

8bxp

color = "dose", palette = "jco")

bxp

# Dot plot (dp)

dp

color = "dose", palette = "jco", binwidth = 1)

dp

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19# Bar plot (bp)

bp

fill = "cyl", # change fill color by cyl

color = "white", # Set bar border colors to white

palette = "jco", # jco journal color palett. see ?ggpar

sort.val = "asc", # Sort the value in ascending order

sort.by.groups = TRUE, # Sort inside each group

x.text.angle = 90 # Rotate vertically x axis texts

)

bp + font("x.text", size = 8)

# Scatter plots (sp)

sp

add = "reg.line", # Add regression line

conf.int = TRUE, # Add confidence interval

color = "cyl", palette = "jco", # Color by groups "cyl"

shape = "cyl" # Change point shape by groups "cyl"

)+

stat_cor(aes(color = cyl), label.x = 3) # Add correlation coefficient

sp

组合多张图片在一个面板上

使用ggpubr包的ggarrange()进行以下操作:1

2

3ggarrange(bxp, dp, bp + rremove("x.text"),

labels = c("A", "B", "C"),

ncol = 2, nrow = 2)

给图片添加注释

在这里, ggpubr包提供了函数annotate_figure()可以对面板中图片整体或任意图片添加一定量的注释

展示效果如下图:1

2

3

4

5

6

7

8

9

10figure

ncol = 1, nrow = 2)

annotate_figure(figure,

top = text_grob("Visualizing mpg", color = "red", face = "bold", size = 14),

bottom = text_grob("Data source: n mtcars data set", color = "blue",

hjust = 1, x = 1, face = "italic", size = 10),

left = text_grob("Figure arranged using ggpubr", color = "green", rot = 90),

right = "I'm done, thanks :-)!",

fig.lab = "Figure 1", fig.lab.face = "bold"

)

图片对齐

最经典的例子就是在绘制生存曲线时,把risk table放在生存曲线图的下边

此时,我们需要调节表和图的大小和相对位置,使其分布更为合理1

2

3

4

5

6

7

8

9

10

11

12# Fit survival curves

library(survival)

fit

# Plot survival curves

library(survminer)

ggsurv

palette = "jco", # jco palette

pval = TRUE, pval.coord = c(500, 0.4), # Add p-value

risk.table = TRUE # Add risk table

)

ggarrange(ggsurv$plot, ggsurv$table, heights = c(2, 0.7),

ncol = 1, nrow = 2)

此时,我们可以看出图和表并不是完全垂直对齐的,要对齐他们需要调用align参数1

2ggarrange(ggsurv$plot, ggsurv$table, heights = c(2, 0.7),

ncol = 1, nrow = 2, align = "v")

改变图形的行列布局排布

1. 使用ggpubr包

我们将使用嵌套的ggarrange()函数来更改图的列/行跨度。

例如,我们使用下边的代码可以实现这样的布局散点图(sp)将位于第一行并跨越两列

箱形图(bxp)和点图(dp)将首先排列,并且将在第二行中生活两列不同的列1

2

3

4

5ggarrange(sp, # First row with scatter plot

ggarrange(bxp, dp, ncol = 2, labels = c("B", "C")), # Second row with box and dot plots

nrow = 2,

labels = "A" # Labels of the scatter plot

)

2. 使用cowplot包

函数ggdraw()+ draw_plot()+ draw_plot_label()的组合可用于将图形放置在特定大小的特定位置。

ggdraw()可以初始化一个空的绘图画布,默认情况是这样的:

draw_plot()可以将绘图放置在绘图画布上的某处:1draw_plot(plot, x = 0, y = 0, width = 1, height = 1)

draw_plot_label() 可以向图的左上角添加绘图标签。它可以处理带有关联坐标的标签向量。1draw_plot_label(label, x = 0, y = 1, size = 16, ...)

如果需要组合多张图形,可以通过类似于下边的代码来实现:1

2

3

4

5

6

7library("cowplot")

ggdraw() +

draw_plot(bxp, x = 0, y = .5, width = .5, height = .5) +

draw_plot(dp, x = .5, y = .5, width = .5, height = .5) +

draw_plot(bp, x = 0, y = 0, width = 1, height = 0.5) +

draw_plot_label(label = c("A", "B", "C"), size = 15,

x = c(0, 0.5, 0), y = c(1, 1, 0.5))

3. 使用gridExtra包

gridExtra包的使用方法和ggpubr包类似1

2

3

4library("gridExtra")

grid.arrange(sp, # First row with one plot spaning over 2 columns

arrangeGrob(bxp, dp, ncol = 2), # Second row with 2 plots in 2 different columns

nrow = 2) # Number of rows

我们同样可以使用gird.arrange()函数中的lay_matrix参数来设置,使用方法如下:1

2

3

4grid.arrange(bp, # bar plot spaning two columns

bxp, sp, # box plot and scatter plot

ncol = 2, nrow = 2,

layout_matrix = rbind(c(1,1), c(2,3)))在上面的R代码中,layout_matrix是一个2×2矩阵(2列和2行)。 第一行全是1,这是第一幅图占的地方,横跨两列; 第二行包含分别占据一列的图2和图3

此时,如果需要对图形进行注释,ggpubr包已经不足以实现,需要我们使用cowplot包来进行进一步的注释

需要注意的是grid.arrange()/ arrangeGrob()输出的是一个gtable,首先需要使用ggpubr包中的as_ggplot()函数将其转换为ggplot。 接下来,就可以使用函数draw_plot_label()对其进行注释。1

2

3

4

5

6

7

8

9

10

11

12

13library("gridExtra")

library("cowplot")

# Arrange plots using arrangeGrob

# returns a gtable (gt)

gt

bxp, sp, # box plot and scatter plot

ncol = 2, nrow = 2,

layout_matrix = rbind(c(1,1), c(2,3)))

# Add labels to the arranged plots

p

draw_plot_label(label = c("A", "B", "C"), size = 15,

x = c(0, 0, 0.5), y = c(1, 0.5, 0.5)) # Add labels

p在上面的R代码中,我们使用了arrangeGrob()而不是grid.arrange()。请注意,这两个函数的主要区别在于,grid.arrange()会自动绘制排列好的图。由于我们要在绘制之前注释已排列的图,因此在这种情况下,函数arrangeGrob()是首选。

4. 使用grid包

通过函数grid.layout(),可以使用gridR包创建复杂的图像布局。 它还提供了函数viewport()来定义布局上图像的区域或位置。 函数print()用于将图放置在指定区域中。

总结起来共以下5个顺序步骤:

1. 创建绘图:p1,p2,p3,…

2. 使用函数grid.newpage()创建画板

3. 创建画板布局2X2 - 列数= 2; 行数= 2

4. 定义图像输出位置:画板中图像显示的区域

5. 在画板中输出显示图片1

2

3

4

5

6

7

8

9

10

11

12

13

14library(grid)

# Move to a new page

grid.newpage()

# Create layout : nrow = 3, ncol = 2

pushViewport(viewport(layout = grid.layout(nrow = 3, ncol = 2)))

# A helper function to define a region on the layout

define_region

viewport(layout.pos.row = row, layout.pos.col = col)

}

# Arrange the plots

print(sp, vp = define_region(row = 1, col = 1:2)) # Span over two columns

print(bxp, vp = define_region(row = 2, col = 1))

print(dp, vp = define_region(row = 2, col = 2))

print(bp + rremove("x.text"), vp = define_region(row = 3, col = 1:2))

通用图例的设定

在我们绘制的图片当中,有的可能具有相同的图例,函数ggarrange()可以与以下参数一起使用,使两幅图使用相同的图例common.legend = TRUE:使用公共图例

legend:指定图例位置。 允许的值包括c(“top”,“bottom”,“left”,“right”)1

2ggarrange(bxp, dp, labels = c("A", "B"),

common.legend = TRUE, legend = "bottom")

实战

给散点图添加边界密度图1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19# Scatter plot colored by groups ("Species")

sp

color = "Species", palette = "jco",

size = 3, alpha = 0.6)+

border()

# Marginal density plot of x (top panel) and y (right panel)

xplot

palette = "jco")

yplot

palette = "jco")+

rotate()

# Cleaning the plots

yplot

xplot

# Arranging the plot

ggarrange(xplot, NULL, sp, yplot,

ncol = 2, nrow = 2, align = "hv",

widths = c(2, 1), heights = c(1, 2),

common.legend = TRUE)

r中gglot怎么组合多张图_怎样组合多张ggplot2图片相关推荐

  1. r中gglot怎么组合多张图_继电器组合扫盲篇

    好多小伙伴留言说,经常看到一些继电器组合,但是不知道是做什么用的,也不知道是不是定型组合,有什么用,怎么命名的?下面咱们就这些问题开展延伸,有需要的小伙伴可以先收藏,懂得多的可以留言区里补充. 先来一 ...

  2. 排列组合思维导图_排列组合——排列数专题

    在上篇关于排列组合主要考点的介绍中,正男老师提到:排列组合考点通常可以拆分为排列数考点和组合数考点.排列数考点相关试题可以细分为2类,分别为:穷举问题和限制条件问题.本期正男老师就从近六年内的5道涉及 ...

  3. r中gglot怎么组合多张图_R语言:多幅图形组合为一幅图形的方法

    备注:学习备忘 在R中使用函数par()或layout()可以容易地组合多幅图形为一幅总括图形. 你可以在par()函数中使用图形参数mfrow=c(nrows, ncols)来创建按行填充的.行数为 ...

  4. 中国定制男装店中的世界顶级面料品牌(组图)_新浪尚品_新浪网

    中国定制男装店中的世界顶级面料品牌(组图)_新浪尚品_新浪网 南方周末 - 世界上最珍贵的面料--vicuna 世界上最珍贵的面料--vicuna 中国定制男装店中的世界顶级面料品牌(组图)_新浪尚品 ...

  5. r中gglot怎么组合多张图_最终版本Science级组合图表绘制

    简介 ggcor 是 厚哥最近的作品,功能完全代替了前两次的你终于可以做这张图和重大升级的两个science组合图表绘制.这里我也为大家带肋实战教程,总体来说厚哥这个ggcor包用起来还是挺方便的,将 ...

  6. python一张图-python 实现在一张图中绘制一个小的子图方法

    有时候为了直观展现图的信息,可以在大图中添加小子图的方式进行数据分析,如下图所示: 具体的代码如下:该图连接了数据库,当然重要的不是数据展示,而是添加子图的方法. import matplotlib. ...

  7. 排列组合思维导图_思维导图:进阶高效能人士的思维工具

    你记录信息的方式越贴近大脑自然的工作方式,你的大脑就越能高效地触发对关键信息的记忆和理解效率.--<思维导图>作者东尼·博赞 信息爆炸的时代,精简思考是进阶高效能人士的一项必备技能.思维导 ...

  8. 排列组合思维导图_思维导图精读《三只小猪》

    绘本<三只小猪>非常有意思,作者借用了孩子们最熟悉的三只小猪的故事,把鼎鼎有名的哲学家苏格拉底变成了大灰狼,数学家毕达哥拉斯变成了青蛙,上演了一出"数学剧". 书中的另 ...

  9. r中如何求变量的对数转换_对数转换以求阳性。

    r中如何求变量的对数转换 In Simple terms, log transform squashes or compresses range of large numbers and expand ...

  10. 程序员才能看懂的30张图,看到最后一张我哭了

    「1」 当我演示一个功能, 但它没有按预期进行时. 「2」 Bug 变 Feature, 这招简直太帅了! 「3」 CPU新用途:烤肉 隔着屏幕都闻到一阵香气 「4」 当我修复一个隐藏Bug时 然后, ...

最新文章

  1. Lnmp安装与配置笔记
  2. RouteHttpMap要添加的引用
  3. 两步实现 mysql 远程连接
  4. Python之数据聚合与分组运算
  5. 浅析个人网站建设需要注重的建设问题
  6. vue使用html渲染组件,Vue.js在渲染组件之前填充数据
  7. ffmpeg-简单AES加解密记录
  8. 【模板】吉老师线段树
  9. php explode txt,PHP explode():字符串转数组
  10. SharePoint 2010 SP1更新发布
  11. workerman相关
  12. Ajax技术(WEB无刷新提交数据)
  13. JS 页面跳转,参数的传递
  14. 解决灵格斯强制更新问题
  15. C语言中,开3次方用什么?
  16. java pdf 修改内容_生成PDF全攻略之在已有PDF上添加内容的实现方法
  17. 2020 年我学习到的 20 条软件工程准则
  18. 腾讯云大学大咖分享 | 深入浅出话智能语音识别
  19. 魔塔java源代码_魔塔java代码
  20. 五子棋程序设计(C语言、人机对战、禁手)

热门文章

  1. PHP生成DataMatrix二维条码
  2. 光伏电站清扫机器人_光伏电站清扫机器人_雷曼科林
  3. php 热搜词,2020 十大网络热搜流行语来了!你知道几个?
  4. 网传程序员加班猝死,当事人:我还在写代码
  5. kata containers调研
  6. 《使用Python进行自然语言处理》学习笔记四
  7. 360视频:正八面体投影OHP
  8. linux系统查看ssh是否开启,linux查看与开启ssh
  9. 52单片机蜂鸣器葫芦娃c语言代码,arduino上实现葫芦娃播放
  10. Word文档人民币符号怎么打出来