R语言拼图

转自https://mp.weixin.qq.com/s/W2nKMe4u2VLBswFkvhoXDw
实例

customLayout拼图
cowplot是ggplot2包的简单补充,可以组合多个”ggplot2”绘制的图为一个图,并且为每个图加上例如A,B,C等标签
grid画布分割
gridExtra可子母图

1. customLayout包

library(ggplot2)
library(customLayout)

(1)简单布局

i.lay1<-lay_new(mat = matrix(1:4,ncol=2),widths = c(3,2),heights = c(2,1))
lay_show(lay1)

I

ii.lay2 <- lay_new( matrix(1:4, nc = 2), widths = c(3, 5),heights = c(2, 4))

II

iii.cl_1 <- lay_bind_col(lay1, lay2, widths = c(3, 1))
按行合并

iv.cl_2 <- lay_bind_row(lay1, lay2, heights = c(3, 1))
按列合并

v.slay <- lay_split_field(lay1, lay2, field = 1)
填充

(2)绘图对象填充

lay1 <- lay_new(matrix(1:2, ncol = 1))
lay2 <- lay_new(matrix(1:3))
cl <- lay_bind_col(lay1, lay2, widths = c(3, 1))

lay_show(cl)

image.png

cuts <- sort(unique(diamonds[["cut"]]), decreasing = TRUE)
make_cut_plot <- function(cut) {
                                dd <- diamonds[cut == diamonds[["cut"]], ]
                                ggplot(dd) + geom_point(aes(carat, price)) +  facet_wrap("cut")
                                }

plots <- lapply(cuts, make_cut_plot)
lay_grid(plots, cl)
image.png

2. cowplot包

library(gridExtra)
library(ggplot2)
library(cowplot)
library(showtext)
font_add_google("Dancing Script", "Dancing")
plot.iris <- ggplot(iris, aes(Sepal.Length, Sepal.Width)) +
geom_point() +
facet_grid(cols = vars(Species))
plot.iris
plot.mpg <- ggplot(mpg, aes(x = cty, y = hwy, colour = factor(cyl))) +
geom_point(size = 2.5) +
labs(title = "dot plot")
plot.mpg
plot.diamonds <- ggplot(diamonds, aes(clarity, fill = cut)) +
geom_bar() +
theme(axis.text.x = element_text(angle = 70, vjust = 0.5)) +
labs(title = "bar plot")
plot.diamonds
gg <- ggdraw() +
draw_plot(plot.iris, 0, 0.5, 1, 0.5) + # 在母图上半部,占母图比例1/2
draw_plot(plot.mpg, 0, 0, 0.5, 0.5) + # 在母图左下角,占母图比例1/4
draw_plot(plot.diamonds, 0.5, 0, 0.5, 0.5) + # 在母图右下角,占母图比例1/4
draw_plot_label(c("A", "B", "C"), c(0, 0, 0.5), c(1, 0.5, 0.5), size = 15, colour = "cyan", family = "Dancing") # 加上标签,
showtext_begin()
print(gg)
showtext_end()
image.png

3. grid包

library(ggplot2)
library(grid)
library(showtext)

(1) 简单布局

YaHei <- windowsFont("微软雅黑")font_add("YaHei", regular = "msyh.ttc", bold = "msyhbd.ttc")  # 右键字体,然后点击属性,regular指定常规, bold表示指定粗体字体 
showtext_auto()

plot.iris <- ggplot(iris, aes(Sepal.Length, Sepal.Width)) + 
geom_point() + 
facet_grid(cols = vars(Species))  # 按Species列分面

plot.mpg <- ggplot(mpg, aes(x = cty, y = hwy, colour = factor(cyl))) + 
geom_point(size = 2.5) +       
labs(title = "dot plot")

plot.diamonds <- ggplot(diamonds, aes(clarity, fill = cut)) + 
geom_bar() + 
theme(axis.text.x = element_text(angle = 70, 
    vjust = 0.5)) + labs(title = "bar plot")

grid.newpage() # 新建画布
layout_1 <- grid.layout(nrow = 3, ncol = 2, widths = c(1, 1), heights = c(1, 4, 5)) # 分成上下2*3共6个版块,最上面版块显示标题

pushViewport(viewport(layout = layout_1))  # 推出分成6个版块的视窗
print(plot.iris, vp = viewport(layout.pos.row = 2, layout.pos.col = c(1, 2)))  # 在中间一行子视窗中画plot.iris
print(plot.mpg, vp = viewport(layout.pos.row = 3, layout.pos.col = 1))  # 在左下角子视窗中画plot.mpg
print(plot.diamonds, vp = viewport(layout.pos.row = 3, layout.pos.col = 2))  #在右下角子视窗中画plot.diamonds
grid.text("我是画布名称", x = 0.5, y = 0.95, gp = gpar(col = "orange", fontfamily = "YaHei", fontsize = 15))  # 增加画布标题
image.png

(2)蝴蝶图

library(ggplot2)
library(grid)
library(dplyr)
library(showtext)
library(Cairo)
YaHei <-  windowsFont("微软雅黑")
font_add("YaHei",regular = "msyh.ttc", bold = "msyhbd.ttc") # 右键字体,然后点击属性,regular指定常规, bold表示指定粗体字体 
showtext_begin()#生成图形所需数据集:
mydata<-data.frame(id=1:14,
A=c(5.0,14.7,2.5,8.5,5.1,6.9,7.7,6.8,4.4,4.9,5.3,1.0,0.9,7.8),
B=c(31.3,24.7,17.8,17.2,15.3,14.3,13.9,13.9,12.4,10.0,6.5,4.2,2.5,0.9),
Label=c("Website","Customer & Employee Referral","Webinar","Facebook/Twitter/Other Social","Marketting & Advertising","Paid Serch","Other","Sales generated","Tradeshows","Parter","Linkedin","Events","Lead list","Emial Campaign"))
p1<-ggplot(mydata) + # 绘制右侧的柱形图  
geom_hline(yintercept=mean(mydata$A),linetype=2,size=.25,colour="grey")+  
geom_bar(aes(x=id,y=A),stat="identity",fill="#E2BB1E",colour=NA)+  
ylim(-5.5,16)+   
scale_x_reverse()+   
geom_text(aes(x=id,y=-4,label=Label),vjust=.5)+  
geom_text(aes(x=id,y=A+.75,label=paste0(A,"%")),size=4.5,family="YaHei",fontface="bold")+  
coord_flip()+  
theme_void()
p2<-ggplot(mydata)+ # 绘制左侧柱形图, 左侧图没有横坐标刻度标签  
geom_hline(yintercept=-mean(mydata$B),linetype=2,size=.25,colour="grey")+  geom_bar(aes(x=id,y=-B),stat="identity",fill="#C44E4C",colour=NA)+ 
# y=-B,绘制的图形在另一侧  
ylim(-40,0)+  scale_x_reverse()+ #   
geom_text(aes(x=id,y=-B-1.75,label=paste0(B,"%")),size=4.5,family="YaHei",fontface="bold")+  
coord_flip()+  
theme_void()
# 图形拼接
grid.newpage() # 新建画布
layout_1 <- grid.layout(nrow = 2, ncol = 2, widths = c(2, 3), heights = c(1, 9)) # 分成2*2共4个版块
pushViewport(viewport(layout = layout_1)) # 推出分为4个版块的视窗
print(p1, vp = viewport(layout.pos.row = 2, layout.pos.col = 2)) # 将p1输出到右下角
print(p2, vp = viewport(layout.pos.row = 2, layout.pos.col = 1)) # 将p2输出到左下角# 添加主标题和分标题

grid.text(label="我是主标题",x = 0.5,y = 0.97,gp=gpar(col="cyan",fontsize=15,fontfamily="YaHei",draw=TRUE,just = "centre"))
grid.text(label="我是左标题", x = 0.15,y =0.94,gp=gpar(col="blue",fontsize=10,fontfamily="YaHei",draw=TRUE,just = c("left", "top")))
grid.text(label="我是右标题",x = 0.85,y =0.94,gp=gpar(col="blue",fontsize=10,fontfamily="YaHei",draw=TRUE,just = c("right", "top")))
showtext_end()
蝴蝶图

4. gridExtra包

(1)简单布局

library(ggplot2)
library(gridExtra)
library(showtext)

YaHei <-  windowsFont("微软雅黑")
font_add("YaHei",regular = "msyh.ttc", bold = "msyhbd.ttc") # 右键字体,然后点击属性,regular指定常规, bold表示指定粗体字体 
showtext.auto()

empty <- ggplot() + geom_point(aes(1, 1), colour = "white") +   
theme(axis.ticks = element_blank(), 
        panel.background = element_blank(), 
        axis.line = element_blank(), 
        axis.text.x = element_blank(), axis.text.y = element_blank(), 
        axis.title.x = element_blank(), axis.title.y = element_blank())

scatter <- ggplot() + 
geom_point(aes(mtcars$mpg, mtcars$qsec)) # 绘制主图散点图
hist_top <- ggplot() + 
geom_histogram(aes(mtcars$mpg)) # 绘制上方频率分布直方图
hist_right <- ggplot() + 
geom_histogram(aes(mtcars$qsec)) + coord_flip() # 绘制右侧频率分布直方图# 最终组合,由4个图拼图而成,只有右上角的图已经将标注移除了
grid.arrange(hist_top, empty, scatter, hist_right, 
# 按从左到右,从上到下顺序排列4个图ncol = 2, nrow = 2, widths = c(4, 1), heights = c(1, 4)) 

4个版块的长宽比例# 其实这种组合图已经有相应的R包了,

df <- data.frame(x = mtcars$mpg, y = mtcars$qsec)
p <- ggplot(df, aes(x, y)) + geom_point() + theme_classic()
ggExtra::ggMarginal(p, type = "histogram")
1

2

(2)子母图

library(ggplot2)
library(gridExtra)
g <- ggplotGrob(qplot(1, 1) +                               
theme(plot.background = element_rect(colour = "black")))
qplot(1:10, 1:10) +    
annotation_custom(      # 通过添加注释的方式,向图形内部添加一个图形
    grob = g,  # 插入图形对象,即添加内容
    xmin = 1, xmax = 5, ymin = 5, ymax = 10 # 添加位置4个坐标
  )
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容