在許多時(shí)候蒲拉,我們需要將多張圖表放在一起潭苞,當(dāng)然我們可以用PS來處理忽冻,但是作為一個(gè)R的Master,怎么可能容忍這種事情發(fā)生此疹。本文總結(jié)了如何在一頁(yè)放多張繪畫僧诚,供大家參考。在網(wǎng)友的提醒下蝗碎,從新梳理了方法湖笨。
方法一:multiplot function
用函數(shù)來處理,但是效果不是很好蹦骑。
This is the definition of multiplot. It can take any number of plot objects as arguments, or if it can take a list of plot objects passed to plotlist.
# Multiple plot function
#
# ggplot objects can be passed in ..., or to plotlist (as a list of ggplot objects)
# - cols: Number of columns in layout
# - layout: A matrix specifying the layout. If present, 'cols' is ignored.
#
# If the layout is something like matrix(c(1,2,3,3), nrow=2, byrow=TRUE),
# then plot 1 will go in the upper left, 2 will go in the upper right, and
# 3 will go all the way across the bottom.
#
multiplot <- function(..., plotlist=NULL, file, cols=1, layout=NULL) {
library(grid)
# Make a list from the ... arguments and plotlist
plots <- c(list(...), plotlist)
numPlots = length(plots)
# If layout is NULL, then use 'cols' to determine layout
if (is.null(layout)) {
# Make the panel
# ncol: Number of columns of plots
# nrow: Number of rows needed, calculated from # of cols
layout <- matrix(seq(1, cols * ceiling(numPlots/cols)),
ncol = cols, nrow = ceiling(numPlots/cols))
}
if (numPlots==1) {
print(plots[[1]])
} else {
# Set up the page
grid.newpage()
pushViewport(viewport(layout = grid.layout(nrow(layout), ncol(layout))))
# Make each plot, in the correct location
for (i in 1:numPlots) {
# Get the i,j matrix positions of the regions that contain this subplot
matchidx <- as.data.frame(which(layout == i, arr.ind = TRUE))
print(plots[[i]], vp = viewport(layout.pos.row = matchidx$row,
layout.pos.col = matchidx$col))
}
}
}
方法二:用ggpubr包
ggpubr包的全稱為'ggplot2' Based Publication Ready Plots,基于ggplot2的出版級(jí)圖形制作包慈省。
Hadley Wickham創(chuàng)建的可視化包ggplot2可以流暢地進(jìn)行優(yōu)美的可視化,但是如果要通過ggplot2定制一套圖形眠菇,尤其是適用于雜志期刊等出版物的圖形边败,對(duì)于那些沒有深入了解ggplot2的人來說就有點(diǎn)困難了袱衷,ggplot2的部分語(yǔ)法是很晦澀的。為此Alboukadel Kassambara創(chuàng)建了基于ggplot2的可視化包ggpubr用于繪制符合出版物要求的圖形笑窜。
ggpubr的主要特點(diǎn):
- ggpubr改寫了一些ggplot的圖形函數(shù)致燥,省去了ggplot中許多晦澀的語(yǔ)法,對(duì)于初學(xué)者來說使用起來更容易排截。
-能夠讓非高級(jí)R用戶繪制準(zhǔn)出版級(jí)的精美圖形嫌蚤;
- 更簡(jiǎn)單地設(shè)置圖形的參數(shù),包括顏色断傲、標(biāo)簽搬葬;
- 輕松實(shí)現(xiàn)一頁(yè)多圖,添加圖形注釋艳悔;
- 為條形圖、箱線圖女仰、線圖等自動(dòng)添加p值和顯著性水平猜年;
- ……
先放一張圖
#安裝ggpubr
library(ggpubr)
#未安裝請(qǐng)用install.packages("ggpubr")安裝
library(ggplot2)
library(tibble)
#生成圖形數(shù)據(jù)
x<-1:1000
y<-1:1000
n<-rnorm(1000,0.5,1)
z<--x*(x-500)
data<-as.tibble(cbind(x,y,z,n,f))
#生成p1-p6六個(gè)ggplot圖形對(duì)象
p1 <- ggplot(data = data,aes(x=n))+geom_density()
p2 <- ggplot(data = data,aes(x=n,y=y,color=x))+geom_point()
p3 <- ggplot(data = data,aes(x=x,y=z,color=x))+geom_line()+geom_point(x=x,y=n*100)
p4 <- ggplot(data = data,aes(x=n,color="red"))+geom_histogram()
p5 <- ggplot(data = data,aes(x=n,y=y*n,color=x))+geom_point()
p6 <- ggplot(data = data,aes(x=n))+geom_histogram(bins = 20,fill=1:20)+coord_polar()
#利用ggarrange將圖像排列在一起
ggarrange(p1,p2,p3,p4,p5,p6,ncol = 2,nrow =3,widths = c(1,2),heights = c(1,1,2))
解讀
一頁(yè)放置多張圖主要利用ggarrange()
函數(shù):
ggarrange
(...
,plotlist
= NULL,ncol
= NULL,nrow
= NULL,labels
= NULL,label.x
= 0,label.y
= 1,hjust
= -0.5,vjust
= 1.5,
font.label
= list(size = 14, color = "black", face = "bold", family = NULL),
align
= c("none", "h", "v", "hv"),widths
= 1,heights
= 1,
legend
= NULL,common.legend
= FALSE)
...
需要畫的圖對(duì)象,plotlist
需要畫的圖清單,ncol
和nrow
是要排列成幾行幾列labels
每個(gè)圖的標(biāo)簽疾忍,label.x
label.y
hjust
vjust
font.label
都是調(diào)整labels的位置參數(shù)乔外,align
各個(gè)圖的排列方式,是縱向還是橫向排列一罩,widths
和heights
調(diào)整各圖的長(zhǎng)寬比列legend
是各圖的圖例杨幼,commn.legend
公共的圖例
函數(shù)能畫 "ggplot", "gtable", "grob", "recordedplot"等類, 或圖形函數(shù)。
方法三:用gredExtra包grid.arrange函數(shù)
library(gridExtra)
#安裝ggpubr時(shí)聂渊,會(huì)依賴于該包
grid.arrange(p1,p2,p3,p4,p5,p6,ncol=3,nrow=2)
方法四:用cowplot包的plot_grid函數(shù)
library("cowplot")
plot_grid(p1,p2,p3,p4,p5,p6, labels = c("A", "B", "C","D","E","F"), ncol = 2, nrow = 3)
方法五: R的基礎(chǔ)繪圖函數(shù)par()
和layout()
函數(shù)
許多時(shí)候我們會(huì)舍本逐末差购,追求一些高級(jí)的函數(shù)而忘記了R的基礎(chǔ)繪圖函數(shù)。對(duì)于R的基礎(chǔ)畫圖函數(shù)畫的圖可以用par
和layout
處理汉嗽。
par用于設(shè)置簡(jiǎn)單的幾行幾列欲逃,參數(shù)簡(jiǎn)單。
layout同過一個(gè)參數(shù)矩陣饼暑,構(gòu)造圖形布局稳析。
同時(shí)同過width和height參數(shù)控制布局的比例,實(shí)現(xiàn)圖形的任意布置弓叛。
- 首先將一幅圖進(jìn)行切塊彰居。
- 然后構(gòu)建布局矩陣。
- 設(shè)置長(zhǎng)寬比例撰筷。
-
最后填充圖形陈惰。
par畫出的結(jié)果
attach(mtcars)
par(mfrow=c(3,2))
hist(wt)
hist(mpg)
hist(disp)
hist(carb)
hist(wt)
hist(mpg)
#用layout函數(shù),將整張圖切成9塊,3*3矩陣闭专,12放一張圖奴潘,3和6放一張旧烧,89放一張,4和5 單獨(dú)一張圖画髓;
#構(gòu)造布局矩陣
mat<-matrix(c(1,1,2,3,4,2,0,5,5),3,3,byrow=TRUE)
mat
layout(mat)
hist(wt)
hist(mpg)
hist(disp)
hist(carb)
hist(wt)
上面的的方法存在一個(gè)問題掘剪,不同的函數(shù)畫出的圖沒法放在一個(gè)頁(yè)面里面。
方法六:grid包viewport
函數(shù)
這里就會(huì)用到grid包奈虾,grid包以前是第三方包夺谁,隨著其重要性,grid隨著R包直接打包下載肉微。grid包的核心是viewport,viewport中又可以嵌套viewport匾鸥,多個(gè)viewport可以構(gòu)成一顆樹,詳細(xì)的用法碉纳,我后續(xù)再出一篇博文介紹勿负。
針對(duì)本文的例子我們用viewport將p1-p6。
#新建一個(gè)繪圖
grid.newpage()
#構(gòu)建布局舉證
l1<-grid.layout(4, 4)
#主節(jié)點(diǎn)
vpmain<-viewport(layout =l1 ,name = "main")
pushViewport(vpmain)
print(p1, vp=viewport(layout.pos.row=2:3, layout.pos.col=1:2))
print(p2, vp=viewport(layout.pos.row=1, layout.pos.col=1:2))
print(p3, vp=viewport(layout.pos.row=2:3, layout.pos.col=3))
print(p4, vp=viewport(layout.pos.row=1, layout.pos.col=3))
print(p5, vp=viewport(layout.pos.row=1:3, layout.pos.col=4))
print(p6, vp=viewport(layout.pos.row=4, layout.pos.col=4))
參考:
ggpubr: Publication Ready Plots
sessionInfo()信息
sessionInfo()
R version 3.5.1 (2018-07-02)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS High Sierra 10.13.6
Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRlapack.dylib
locale:
[1] zh_CN.UTF-8/zh_CN.UTF-8/zh_CN.UTF-8/C/zh_CN.UTF-8/zh_CN.UTF-8
attached base packages:
[1] grid parallel stats4 stats graphics grDevices utils datasets methods
[10] base