R成精系列-一頁(yè)多圖

在許多時(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值和顯著性水平猜年;
- ……
先放一張圖


一頁(yè)放多圖
#安裝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需要畫的圖清單,ncolnrow是要排列成幾行幾列
  • labels每個(gè)圖的標(biāo)簽疾忍,label.x label.y hjust vjust font.label都是調(diào)整labels的位置參數(shù)乔外,
  • align各個(gè)圖的排列方式,是縱向還是橫向排列一罩,widthsheights調(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ù)畫的圖可以用parlayout處理汉嗽。
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é)果
布局矩陣

layout結(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。


grid一頁(yè)多圖
#新建一個(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     

參考網(wǎng)址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末劳曹,一起剝皮案震驚了整個(gè)濱河市奴愉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌铁孵,老刑警劉巖锭硼,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蜕劝,居然都是意外死亡檀头,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門岖沛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來暑始,“玉大人,你說我怎么就攤上這事烫止〗裕” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵馆蠕,是天一觀的道長(zhǎng)期升。 經(jīng)常有香客問我,道長(zhǎng)互躬,這世上最難降的妖魔是什么播赁? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮吼渡,結(jié)果婚禮上容为,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好坎背,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布替劈。 她就那樣靜靜地躺著,像睡著了一般得滤。 火紅的嫁衣襯著肌膚如雪陨献。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天懂更,我揣著相機(jī)與錄音眨业,去河邊找鬼。 笑死沮协,一個(gè)胖子當(dāng)著我的面吹牛龄捡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播慷暂,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼聘殖,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了行瑞?” 一聲冷哼從身側(cè)響起就斤,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蘑辑,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坠宴,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洋魂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了喜鼓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片副砍。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖庄岖,靈堂內(nèi)的尸體忽然破棺而出豁翎,到底是詐尸還是另有隱情,我是刑警寧澤隅忿,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布心剥,位于F島的核電站,受9級(jí)特大地震影響背桐,放射性物質(zhì)發(fā)生泄漏优烧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一链峭、第九天 我趴在偏房一處隱蔽的房頂上張望畦娄。 院中可真熱鬧,春花似錦、人聲如沸熙卡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)驳癌。三九已至滑燃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間喂柒,已是汗流浹背不瓶。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留灾杰,地道東北人蚊丐。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像艳吠,于是被迫代替她去往敵國(guó)和親麦备。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容