R語言基本繪圖函數中能夠利用par()以及layout()來進行圖形排列,可是這兩個函數對於ggplot圖則不太適用,本文主要講解如何對多ggplot圖形多頁面進行排列。主要講解如何利用包gridExtra、cowplot以及ggpubr中的函數進行圖形排列。php
#load packages library(gridExtra) library(cowplot) library(ggpubr) #dataset ToothGrowth and mtcars mtcars$name <- rownames(mtcars) mtcars$cyl <- as.factor(mtcars$cyl) head(mtcars[, c("name", "wt","mpg", "cyl")])
#First let's create some plots #Box plot(bxp) bxp <- ggboxplot(ToothGrowth, x="dose", y="len", color = "dose", palette = "jco") #Dot plot(dp) dp <- ggdotplot(ToothGrowth, x="dose", y="len", color = "dose", palette = "jco", binwidth = 1) #An ordered Bar plot(bp) bp <- ggbarplot(mtcars, x="name", y="mpg", fill="cyl", #change fill color by cyl color="white", #Set bar border colors to white palette = "jco", #jco jourbal color palette 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 <- ggscatter(mtcars, x="wt", y="mpg", add = "reg.line", #Add regression line conf.int = TRUE, #Add confidence interval color = "cyl", palette = "jco",#Color by group cyl shape = "cyl" #Change point shape by groups cyl )+ stat_cor(aes(color=cyl), label.x = 3) #Add correlation coefficientsp
多幅圖形排列於一面css
ggarrange(bxp, dp, bp+rremove("x.text"), labels = c("A", "B", "C"), ncol = 2, nrow = 2)
plot_grid(bxp, dp, bp+rremove("x.text"), labels = c("A", "B", "C"), ncol = 2, nrow = 2)
grid.arrange(bxp, dp, bp+rremove("x.text"), ncol=2, nrow=2)
figure <- ggarrange(sp, bp+font("x.text", size = 10), 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")
library(survival) head(colon[, c(1:4)]) #Fit survival curves fit <- survfit(Surv(time, status)~adhere, data = colon) library(survminer) ggsurv <- ggsurvplot(fit, data = colon, palette = "jco", #jco palette pval = TRUE, pval.coord=c(500, 0.4), #Add p-value risk.table = TRUE #Add risk table) names(ggsurv)
## [1] "plot" "table" "data.survplot" "data.survtable"
ggsurv是一個包含兩部分的listhtml
ggarrange(ggsurv$plot, ggsurv$table, heights = c(2, 0.7), ncol = 1, nrow = 2)
上圖中的座標軸沒有對齊,能夠經過參數align來設置shell
ggarrange(ggsurv$plot, ggsurv$table, heights = c(2, 0.7), ncol = 1, nrow = 2, align = "v")
設置面板爲兩行兩列,其中sp佔據第一行的兩列,bxp以及dp置於第二行的兩列bash
ggarrange(sp, #First row with scatter plot(sp) ggarrange(bxp, dp, ncol = 2, labels = c("B","C")),#Second row with box and dot plot nrow = 2, labels = "A" #Labels of the scatter plot)
cowplot::ggdraw()能夠將圖形置於特定位置, ggdraw()首先會初始化一個繪圖面板, 接下來draw_plot()則是將圖形繪製於初始化的繪圖面板中,經過參數設置能夠將圖形置於特定位置。markdown
draw_plot(plot, x=0, y=0, width=1, height=1)
其中:session
draw_plot_label(label, x=0, y=1, size=16, ...)
其中:ide
下面經過一個例子來說解如何將多個圖形放置在特定的位置。函數
ggdraw()+ draw_plot(bxp, x=0, y=0.5, width=0.5, height = 0.5)+ draw_plot(dp, x=0.5, y=0.5, width = 0.5, height = 0.5)+ draw_plot(bp, x=0, y=0, width = 1.5, 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))
gridExtra::arrangeGrop()改變行列分佈佈局
下面將sp置於第一行並橫跨兩列,而bxp和dp分別分佈於第二行兩列
grid.arrange(sp, #First row with one plot spaning over 2 columns arrangeGrob(bxp, dp, ncol = 2), #Second row with 2plots in 2 different columns nrow=2) #number of rows
也能夠經過函數grid.arrange中的layout_matrix來設置複雜的圖形佈局
grid.arrange(bp, #bar plot spaning two columns bxp, sp, #box plot amd scatter plot ncol=2, nrow=2, layout_matrix=rbind(c(1, 1), c(2, 3)))
要相對grid.arrange()以及arrangeGrob()的輸出進行註釋,首先要利用as_ggplot()將其轉化爲ggplot圖形,進而利用函數draw_plot_label()對其進行註釋。
gt <- arrangeGrob(bp, bxp, sp, layout_matrix = rbind(c(1,1),c(2, 3))) p <- as_ggplot(gt)+ draw_plot_label(label = c("A", "B", "C"), size = 15, x=c(0, 0, 0.5), y=c(1, 0.5, 0.5)) p
R包grid中的grid.layout()能夠設置複雜的圖形佈局,viewport()能夠定義一個區域用來安置圖形排列,print()則用來將圖形置於特定區域。 總結起來步驟以下:
library(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 <- function(row, col){ 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))
ggpubr::ggarrange()能夠爲組合圖形添加共同圖例
ggarrange(bxp, dp, labels = c("A", "B"), common.legend = TRUE, legend = "bottom")
sp <- ggscatter(iris, x="Sepal.Length", y="Sepal.Width", color="Species", palette = "jco", size=3, alpha=0.6)+border() #Marginal density plot of x(top panel) and y(right panel) xplot <- ggdensity(iris, "Sepal.Length", fill="Species",palette = "jco") yplot <- ggdensity(iris, "Sepal.Width", fill="Species", palette = "jco")+rotate() #Clean the plots xplot <- xplot+clean_theme() yplot <- yplot+clean_theme() #Arrange the plots ggarrange(xplot, NULL, sp, yplot, ncol = 2, nrow = 2, align = "hv", widths = c(2, 1), heights = c(1, 2), common.legend = TRUE)
density.p <- ggdensity(iris, x="Sepal.Length", fill="Species", palette = "jco") #Compute the summary table of Sepal.Length stable <- desc_statby(iris, measure.var = "Sepal.Length", grps = "Species") stable <- stable[, c("Species", "length", "mean", "sd")] #Summary table plot, medium and theme stable.p <- ggtexttable(stable, rows = NULL, theme = ttheme("mOrange")) text <- paste("iris data set gives the measurements in cm", "of the variables sepal length and width", "and petal length and width, respectively,", "for 50 flowers from each of 3 species of iris.", "The species are Iris setosa, versicolor, and virginica.", sep = " ") text.p <- ggparagraph(text = text, face = "italic", size = 11, color = "black") #Arrange the plots on the same page ggarrange(density.p, stable.p, text.p, ncol = 1, nrow = 3, heights = c(1, 0.5, 0.3))
ggplot2::annotation_custom()能夠添加各類圖形元素到ggplot圖中
annotation_custom(grob, xmin, xmax, ymin, ymax)
其中:
density.p+annotation_custom(ggplotGrob(stable.p), xmin = 5.5, xmax = 8, ymin = 0.7)
sp <- ggscatter(iris, x="Sepal.Length", y="Sepal.Width", color = "Species", palette = "jco", size = 3, alpha=0.6) xbp <- ggboxplot(iris$Sepal.Length, width = 0.3, fill = "lightgray")+ rotate()+theme_transparent() ybp <- ggboxplot(iris$Sepal.Width, width = 0.3, fill="lightgray")+theme_transparent() # Create the external graphical objects # called a "grop" in Grid terminology xbp_grob <- ggplotGrob(xbp) ybp_grob <- ggplotGrob(ybp) #place box plots inside the scatter plot xmin <- min(iris$Sepal.Length) xmax <- max(iris$Sepal.Length) ymin <- min(iris$Sepal.Width) ymax <- max(iris$Sepal.Width) yoffset <- (1/15)*ymax xoffset <- (1/15)*xmax # Insert xbp_grob inside the scatter plots p+annotation_custom(grob = xbp_grob, xmin = xmin, xmax = xmax, ymin = ymin-yoffset, ymax = ymin+yoffset)+ # Insert ybp_grob inside the scatter plot annotation_custom(grob = ybp_grob, xmin = xmin-xoffset, xmax=xmin+xoffset, ymin=ymin, ymax=ymax)
#import the imageimg.file <- system.file(file.path("images", "background-image.png"), package = "ggpubr") img <- png::readPNG(img.file)
利用ggpubr::background_image()爲ggplot圖形添加背景圖
library(ggplot2) library(ggpubr) ggplot(iris, aes(Species,Sepal.Length))+ background_image(img)+ geom_boxplot(aes(fill=Species), color="white")+ fill_palette("jco")
ggplot(iris, aes(Species,Sepal.Length))+ background_image(img)+geom_boxplot(aes(fill=Species), color="white", alpha=0.5)+ fill_palette("jco")
平常工做中咱們有時要繪製許多圖,假如咱們有16幅圖,每頁排列4張的話就須要4頁才能排完,而ggpubr::ggarrange()能夠經過制定行列數自動在多頁之間進行圖形排列
multi.page <-ggarrange(bxp, dp, bp, sp, nrow = 1, ncol = 2)
上述代碼返回兩頁每頁兩圖
multi.page[[1]]
multi.page[[2]]
p1 <- ggarrange(sp, bp+font("x.text", size = 9), ncol = 1, nrow = 2) p2 <- ggarrange(density.p, stable.p, text.p, ncol = 1, nrow = 3, heights = c(1, 0.5, 0.3)) ggarrange(p1, p2, ncol = 2, nrow = 1)
sessionInfo() ## R version 3.4.1 (2017-06-30) ## Platform: x86_64-w64-mingw32/x64 (64-bit) ## Running under: Windows 10 x64 (build 15063) ## ## Matrix products: default ## ## locale: ## [1] LC_COLLATE=Chinese (Simplified)_China.936 ## [2] LC_CTYPE=Chinese (Simplified)_China.936 ## [3] LC_MONETARY=Chinese (Simplified)_China.936 ## [4] LC_NUMERIC=C ## [5] LC_TIME=Chinese (Simplified)_China.936 ## ## attached base packages: ## [1] grid stats graphics grDevices utils datasets methods ## [8] base ## ## other attached packages: ## [1] survminer_0.4.0 survival_2.41-3 ggpubr_0.1.5 magrittr_1.5 ## [5] cowplot_0.8.0 ggplot2_2.2.1 gridExtra_2.2.1 ## ## loaded via a namespace (and not attached): ## [1] zoo_1.8-0 purrr_0.2.3 reshape2_1.4.2 ## [4] splines_3.4.1 lattice_0.20-35 colorspace_1.3-2 ## [7] htmltools_0.3.6 yaml_2.1.14 survMisc_0.5.4 ## [10] rlang_0.1.2 foreign_0.8-69 glue_1.1.1 ## [13] bindrcpp_0.2 bindr_0.1 plyr_1.8.4 ## [16] stringr_1.2.0 munsell_0.4.3 gtable_0.2.0 ## [19] ggsci_2.7 psych_1.7.5 evaluate_0.10.1 ## [22] labeling_0.3 knitr_1.17 parallel_3.4.1 ## [25] broom_0.4.2 Rcpp_0.12.12 xtable_1.8-2 ## [28] scales_0.4.1 backports_1.1.0 cmprsk_2.2-7 ## [31] km.ci_0.5-2 mnormt_1.5-5 png_0.1-7 ## [34] digest_0.6.12 stringi_1.1.5 dplyr_0.7.2 ## [37] KMsurv_0.1-5 rprojroot_1.2 tools_3.4.1 ## [40] lazyeval_0.2.0 tibble_1.3.3 tidyr_0.7.0 ## [43] pkgconfig_2.0.1 Matrix_1.2-11 data.table_1.10.4 ## [46] assertthat_0.2.0 rmarkdown_1.6 R6_2.2.2 ## [49] nlme_3.1-131 compiler_3.4.1