跳转至

ggplot2的首席专家Thomas Lin Pedersen发布了patchwork这个包,专业拼图简单好用。 patchwork官方地址 参考刘小泽 一直深受ggplot2的拼图所困扰,每次需要导出图片在PS或AI里面拼图。有了patchwork可以直接在R里面拼图了。 功能: 1. 拼合多张图 2. 添加ABCD或I II III 3. 同时修改多张图的图注位置 优点:代码简单,易学易懂,完美承接ggplot2.

安装

#CRAN安装稳定版
install.packages("patchwork")
#github安装开发版。二选一即可。
install.packages("devtools")
devtools::install_github("thomasp85/patchwork")

用法示例:

##用以测试patchwork包
##主要是用来拼合多个图片的

setwd("E:/Rcode")
library(ggplot2)
install.packages("patchwork")
library(patchwork)
p1 <- ggplot(mtcars)+geom_point(aes(mpg,disp))
p2 <- ggplot(mtcars)+geom_boxplot(aes(gear,disp,group=gear))
p3 <- ggplot(mtcars) + geom_smooth(aes(disp, qsec))
p4 <- ggplot(mtcars) + geom_bar(aes(carb))
+表示横向排列,/表示纵向排列,一次可以有多个+ /组成公式

p1+p2 p1+p2

p1/p2 p1/p2

p1+p2/p3+p4 p1+p2/p3+p4

p2+(p1/p3)+p4

-表示两个图放置在一个嵌套层

p1-p2

通过ncol指定绘图的列数,或者是nrow指定绘图的行数
当有多个图的时候,如果指定的列或行比图的实际数量少,则会压缩对应的图的宽度或长度

p4+p1+p2+plot_layout(ncol = 2) p4+p1+p2+plot_layout(ncol = 2)

p1+p3+p4/p2+plot_layout(nrow=2) #会压缩p4和p2的高度 p1+p3+p4/p2+plot_layout(nrow=2)

可以用plot_spacer()添加一个空白图占位置

p1+plot_spacer()+p2 p1+plot_spacer()+p2

布局可以使用ABCD来表示
layout2 <- 'AAB
CDD'
p1+p2+p3+p4+plot_layout(design = layout2)
![p1+p2+p3+p4+plot_layout(design = layout2)  ](https://upload-images.jianshu.io/upload_images/18151951-5affc054cdb9c8d0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

给图添加图注字母

p1+p2+p3+p4+plot_annotation(tag_levels = 'I') p1+p2/p3+p4+plot_annotation(tag_levels = 'A') p1+p2/p3+p4+plot_annotation(tag_levels = 'A')

多重标注,先给p4|p2添加,再给p1添加。A1,A2和B

((p4 | p2) + plot_layout(tag_level = 'new'))/p1+plot_annotation(tag_levels = c('A', '1'))

((p4 | p2) + plot_layout(tag_level = 'new'))/p1+plot_annotation(tag_levels = c('A', '1'))

同时添加多个标题

(p1+p2/p3+p4)+plot_layout(guides = 'collect')+plot_annotation(title="test layout for patchwork",caption = 'this is the caption',theme = theme(plot.caption = element_text(size=15)))

同时修改多个图的theme

(p1+p2/p4)*theme_void()

注意*号只能修改当前嵌套层,现在是只修改了p1图层,删除背景颜色

(p1+p2/p4)*theme_void() (p1+p2/p4)&theme_bw()+theme(panel.grid.major = element_blank(),panel.grid.minor = element_blank())

&是同时删除背景颜色和网格线 操作对象是所有图层

(p1+p2/p4)&theme_bw()+theme(panel.grid.major = element_blank(),panel.grid.minor = element_blank())

(p4-p1/p3)*(theme_bw()+ theme(panel.grid.major = element_blank(),panel.grid.minor = element_blank()))

只操作了P4图层,删掉背景色和网格线

注意操作符号:
  • - 是把多个图层合成一个嵌套层,
  • +是把后面的层,添加到前面的层,
  • |/分别表示横向排布和纵向排布。
  • *只操作一个嵌套层,&操作所有的层。

cowplot包的使用(基于ggplot2的拼图包,快速方便)

#### cowplot包拼图
library(ggplot2)
library(cowplot)
setwd("E:/R/cowplot/")
plot.mpg <- ggplot(mpg, aes(x = cty, y = hwy, colour = factor(cyl))) + 
  geom_point(size=2.5)+theme_classic()

plot.diamonds <- ggplot(diamonds, aes(clarity, fill = cut)) + geom_bar() +
  theme(axis.text.x = element_text(angle=70, vjust=0.5))+theme_classic()+scale_y_continuous(expand = c(0,0))
##插入空值,占据位置
plot_grid(plot.mpg,NULL,NULL,plot.diamonds,labels=c("A", "NULL","NULL","B"),ncol = 2)

plot2by2 <- plot_grid(plot.mpg,NULL,NULL,plot.diamonds,labels=c("A", "NULL","NULL","B"),ncol = 2)
plot2by2
##保存图片
save_plot("plot2by2.png", plot2by2,
          ncol = 2, # we're saving a grid plot of 2 columns
          #nrow = 2, # and 2 rows
          # each individual subplot should have an aspect ratio of 1.3
          base_aspect_ratio = 1.3
)

#添加水印标注版权
ggdraw(plot.mpg) + 
  #draw_plot_label("A", size = 14) +                     #添加标签A
  draw_label("Warning!", angle = -45, size = 100, alpha = .2,color = "red") #设置水印的旋转角度,大小,透明度,颜色。

水印效果

使用magick可以读取本地和网络的图片、视频,同时可以编辑图片

#install.packages("magick")
library(ggplot2)
library(magick)
#查看magick支持的图片的种类
str(magick::magick_config())

p <- ggplot(iris, aes(x=Sepal.Length, fill=Species)) + geom_density(alpha = 0.5)+theme_classic()
p2 <- ggdraw()+draw_image("http://jeroen.github.io/images/tiger.svg",scale = .75)
p3 <- ggdraw()+draw_image("./model.png",scale = .8)
plot_grid(p,p2,p3,labels = "AUTO")
ggsave("test_magick.png",width = 170,height = 230,units = "mm",dpi = 300)


tiger <- image_read("http://jeroen.github.io/images/tiger.svg")
sun <- image_read("./model.png")
img <- c(tiger,sun)
img <- image_scale(img, "300x300")
image_info(img)

##magick的OCR识别功能测试(默认识别为英语,其他语言需要安装对应的数据库)
#install.packages("tesseract")
library(tesseract)
img2txt <- function(in_img,out_txt){
  tri_3 <- image_read(in_img)
  image_ocr <- image_ocr(tri_3)
  cat(image_ocr)
  write(image_ocr,out_txt)
}
img2txt("./eng.png","model.txt")

cowplot拼图 左侧是ggplot2画的,右侧是网络图片,c是本地图片,合并到一张图上。

回到页面顶部