0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

R语言-customLayout-包拼图

冬至子 来源:康娜的编程日记 作者:康娜酱 2023-05-19 17:23 次阅读

目标

使用R拼出这样的一张图:

图片

Let's start

1. 安装 customLayout

install.packages("customLayout")

# or
library(devtools)
install_github("zzawadz/customLayout")

简单介绍一下 customLayout 包:

  • lay_new(mat, widths, heights)
    • mat: 数字矩阵,以1开始且连续, 确定区数和排布顺序
    • widths、heights:确定每一区的比例
  • lay_show(lay)
    • 预览分区
  • lay_bind_row(lay1, lay2, ..., heights)
    • 按行将两个布局按特定比例合并,不支持合并两个以上的布局,下同(太拉了~)
  • lay_bind_col(lay1, lay2, ..., widths)
    • 按列将两个布局按特定比例合并
  • lay_split_field(lay1, lay2, field = idx)
    • 将lay1分割一特定部分(第idx区)给lay2,即将lay2嵌入lay1的内部
  • lay_set(lay)
    • 使用指定的布局进行绘图
  • lay_grid(grobs, lay)
    • 用于绘制ggplot对象,并指定布局
    • grobs: 包含多个绘图对象的list
    • lay:绘图布局

有了这些功能,基本上就可以满足拼图需求了。

2. 布局设计

首先根据效果图将图进行分区并且编号,方便制定排版方案,编号规则为从上到下,从左到右

图片

编号之后应该是这样的:

图片

然后确定排版方案:

  • 分为三大部分,12、3456、7 三部分
  • 其中3456部分又可以分为三小部分3、4、56
  • 56又可以分为5、6两小小部分 按此思路,总结为:图片

每大部分内部按行合并,最后将三部分按列合并,并且在排列的时候注意比例。

2. 绘制布局

Step 1:绘制 lay_3456
p3 = p4 = p5 = p6 = lay_new(matrix(1))
lay56 = lay_bind_row(p5, p6, heights = c(1, 1))
lay3456 = lay_bind_col(lay_bind_col(p3, p4, widths = c(2, 4)), lay56, widths = c(6, 3))
lay_show(lay3456)

图片

Step 2:绘制 lay_127并与lay3456合并
lay127 = lay_new(matrix(1:4, nrow = 2), heights = c(6, 3), widths = c(6, 9))
lay_show(lay127)

图片

lay_res = lay_split_field(lay127, lay3456, field = 3)
lay_show(lay_res)

图片

这样布局就已经画好了,接下来直接填图就行了。

使用布局画图

先画个简单的快速看下效果:

pdf("customLayout1.pdf", 13, 9)
lay_set(lay_res)
plot(1:10)
plot(1:10)
plot(1:10)
plot(1:10)
plot(1:10)
plot(1:10)
plot(1:10)
dev.off()

图片

再画个像样点的并测试能不能合并ggplot对象:

# test customLayout
library("customLayout")
library("ggplot2")

data = iris
colnames(data) = LETTERS[1:ncol(data)]

# plot lay3456
p3 = p4 = p5 = p6 = lay_new(matrix(1))
lay56 = lay_bind_row(p5, p6, heights = c(1, 1))
lay3456 = lay_bind_col(lay_bind_col(p3, p4, widths = c(2, 4)), lay56, widths = c(6, 3))
lay_show(lay3456)

# plot lay127 and lay_res
lay127 = lay_new(matrix(1:4, nrow = 2), heights = c(6, 3), widths = c(6, 9))
lay_show(lay127)
lay_res = lay_split_field(lay127, lay3456, field = 3)
lay_show(lay_res)

# fill lay

p1 <- ggplot(data, aes(A, B)) + geom_point(colour = "#dd1c77")
p2 <- ggplot(data, aes(A)) + geom_histogram(binwidth = 0.1, colour = "#dd1c77", fill= "#dd1c77")
p3 <- ggplot(data, aes(B)) + geom_density(alpha = 0.2, colour = "#dd1c77", fill = "white", size = 2)
p4 <- ggplot(data, aes(A, B, fill = C)) + geom_tile()
p5 <- ggplot(data[data[, "E"] == "setosa",], aes(y = C)) + geom_boxplot(colour = "#dd1c77", size = 2)
p6 <- ggplot(data[data[, "E"] == "versicolor",], aes(y = C)) + geom_boxplot(colour = "#dd1c77", size = 2)
p7 <- ggplot(data, aes(x = B, y = C)) + geom_line(colour = "#dd1c77", size = 2)

pdf("customLayout2.pdf", 13, 9)
 plots2 = lapply(c(1:7), function(x) get(paste0("p", x)))
 lay_grid(plots2, lay_res)
dev.off()

图片

另外发现基础包的图和ggplot2的图不能合并,不过一般也不会用基础包来画图~

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Layout
    +关注

    关注

    13

    文章

    395

    浏览量

    61159
  • r语言
    +关注

    关注

    1

    文章

    30

    浏览量

    6200
收藏 人收藏

    评论

    相关推荐

    HarmonyOS开发实战:【亲子拼图游戏】

    编程语言编写的一个分布式益智拼图游戏,可以两台设备同时开启一局拼图游戏,每次点击九宫格内的图片,都会同步更新两台设备的图片位置
    的头像 发表于 04-16 17:00 295次阅读
    HarmonyOS开发实战:【亲子<b class='flag-5'>拼图</b>游戏】

    拼图游戏之新鸟求教老鸟

    本帖最后由 yl383576734 于 2012-4-11 16:47 编辑 如何在这个拼图游戏中,加入统计按键次数和类似排行榜一样的东西,记录每一次完成拼图游戏的按键次数,求给位大神帮忙啊
    发表于 04-11 16:42

    拼图游戏

    本帖最后由 eehome 于 2013-1-5 09:57 编辑 拼图
    发表于 05-24 22:23

    PIC 语言工具问题

    大家好,PIC 我是新手,有个简单的问题请教一下,就是我导入一个mcp的,mplab会报语言工具不对,这个要如何处理,因我导的是网上下下来的,所以不知道之前用的是什么
    发表于 04-19 14:00

    键盘拼图游戏

    在做键盘拼图游戏时,为什么运行时点击按钮图片没有反应??求各位大神指导。。。
    发表于 04-06 10:25

    Matlab与R语言的区别

    具在学术界发表,作者本人或者团队会在第一时间、甚至文章发表前就发布基于这个文章的R扩展,使得其几乎总是走在学术界前沿。r语言和matlab区别总结:1.matlab的语法更适合于矩阵
    发表于 05-03 10:18

    用JS写一个OpenHarmony拼图小游戏

    1. 样例效果本Demo是基于OpenHarmony3.0 LTS,使用JS语言编写的拼图小游戏。
    发表于 07-27 18:24

    【开发样例】用JS写一个OpenHarmony拼图小游戏

    一、简介1.样例效果本Demo是基于OpenHarmony3.0 LTS,使用JS语言编写的拼图小游戏。2.涉及OpenHarmony技术特性JS UI3.支持OpenHarmony版本
    发表于 07-29 14:25

    拼图游戏(java)

    拼图游戏(java)   java编写的一款简单的拼图游戏,可以下载到手机上玩。..rar
    发表于 04-09 15:18 37次下载

    一种图像局部区域匹配驱动的导航式拼图方法

    为了改善传统拼图拼接过程费时低效、影响拼图趣味性的问题,提出了一种图像局部区域匹配驱动的导航式拼图方法。首先,使用 Canny边缘检测算法自动从输入的原始拼图中检测并分割出所有
    发表于 04-21 14:43 4次下载

    如何用C语言实现拼图游戏项目

      这篇文章主要为大家详细介绍了 C语言实现——《拼图游戏项目》 ,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下!   游戏介绍: 对刚开始接触拼图的玩家而言,所谓
    的头像 发表于 11-11 14:13 1561次阅读

    基于STM32设计的拼图小游戏

    基于STM32设计的拼图小游戏
    发表于 11-23 17:51 30次下载
    基于STM32设计的<b class='flag-5'>拼图</b>小游戏

    Turning Lock转锁拼图开源分享

    电子发烧友网站提供《Turning Lock转锁拼图开源分享.zip》资料免费下载
    发表于 11-04 14:37 0次下载
    Turning Lock转锁<b class='flag-5'>拼图</b>开源分享

    C语言+easyX带你实现:数字拼图游戏!

    这是一个简易的拼图游戏,一共有 15 个数字方块,将其一行行的排列为 1~15 即可完成。游戏会记录下完成拼图的时间。我想说的是,很多时候,精彩的游戏不一定非要用图片。将游戏的功能和手感都做好,游戏一样好玩。所以我就做了这个拼图
    的头像 发表于 02-26 10:01 730次阅读

    PyBadge和PyBadge LC的滑动拼图

    电子发烧友网站提供《PyBadge和PyBadge LC的滑动拼图.zip》资料免费下载
    发表于 07-10 16:38 0次下载
    PyBadge和PyBadge LC的滑动<b class='flag-5'>拼图</b>