R语言绘制流程图(二)

640?wx_fmt=gif

点击上方蓝色字体,关注我们

640?wx_fmt=gif 作者简介

作者:吴健 中国科学院大学 R语言、统计学爱好者,尤其擅长R语言和Arcgis在生态领域的应用分享

个人公众号:统计与编程语言 


前文推送:

R语言绘制流程图(一)


上一期我们已经对R语言绘制基本矩形框,文本和线条进行了介绍,本文将在上一期的基础上,通过自编函数快速绘制流程图。

第一步:自定义绘制基本矩形和文本的函数。利用该函数可以快速的根据字段的长度和宽度绘制相应的矩形框,该矩形框为流程图的基本图元。

tableBox <- function(labels, x=0.5, y=0.5) {

    nlabel <- length(labels)#确定标签个数

    taplevp <- viewport(x=x, y=y, width=max(stringWidth(labels))+ unit(4, "mm"),

                        height=unit(nlabel, "lines"))#根据标签的多少绘制矩形框

    pushViewport(taplevp)

    grid.roundrect()

    if (nlabel > 1) {

        for (i in 1:(nlabel-1)) {

            fill <- c("white", "grey")[i%%2+1]

            grid.clip(y=unit(i, "lines"), just="bottom")

            grid.roundrect(gp=gpar(fill=fill))

        }

    }

    grid.clip()#绘制灰色阴影

    grid.text(labels, x=unit(2, "mm"), y=unit(nlabel:1-0.5, 'lines'),just='left')#添加文本

    popViewport()

}


第二步:确定矩形框在绘图窗口的位置,并以该位置为连接线的起点和终点,绘制带箭头的连接线。

boxGrob <- function(labels, x=0.5, y=0.5) {

    grob(labels=labels, x=x, y=y, cl="box")

}#存储矩形框的基本信息


drawDetails.box <- function(x, ...) {

    tableBox(x$labels, x$x, x$y)

}#确定矩形框的基本位置


xDetalis.box <- function(x, theta) {

    nlines <- length(x$labels)

    height <- unit(nlines, 'lines')

    width <- unit(4, "mm")+max(stringWidth(x$labels)) 

    grobX(roundrectGrob(x=x$x, y=x$y, width=width, height=height), theta)

}#确定矩形框在X轴的位置(东西方向)


yDetalis.box <- function(x, theta) {

    nlines <- length(x$labels)

    height <- unit(nlines, 'lines')

    width <- unit(4, "mm")+max(stringWidth(x$labels)) 

    grobY(rectGrob(x=x$x, y=x$y, width=width, height=height), theta)

}#确定矩形框在Y轴的位置(南北方向)


第三步:以上述两个函数为基础绘制流程图

library(grid)

#确定矩形框的大小和矩形框里面的标签

box1 <- boxGrob(c("book_author_table", "ID", "book", "author"),x=0.25)

box2 <- boxGrob(c("book_table", "ISBN", "title", "pub"), x=0.6, y=0.75)

box3 <- boxGrob(c("author_table", "ID", "name", "gender"), x=0.6, y=0.25)

box4 <- boxGrob(c("publisher_table", "ID", "name","country"), x=0.85,y=0.75)

box5 <- boxGrob(c("gender_table", "ID", "gender"), x=0.85,y=0.25)

#绘制矩形框及标签

grid.draw(box1)

grid.draw(box2)

grid.draw(box3)

grid.draw(box4)

grid.draw(box5)

#绘制不同矩形框之间的连接线

grid.curve(xDetalis.box(box1, "east"),

    yDetalis.box(box1, "south")+ unit(1.5, "lines") ,

    xDetalis.box(box2, "west"),

    yDetalis.box(box2, "north")- unit(1.5, "lines") ,

    inflect=TRUE,

    arrow=arrow(type="closed",angle=15,length=unit(2, "mm")),gp=gpar(fill="black"))


grid.curve(xDetalis.box(box1, "east"),

    yDetalis.box(box1, "north") - unit(3.5, "lines"),

    xDetalis.box(box3, "west"),

    yDetalis.box(box3, "south") + unit(2.5, "lines"),

    inflect=T, square=T,curvature=-1,

    arrow=arrow(type="closed", angle=15, length=unit(2, "mm")), gp=gpar(fill="black"))


grid.curve(xDetalis.box(box2, "east"),

    yDetalis.box(box2, "south") + unit(0.5, "lines"),

    xDetalis.box(box4, "west"),

    yDetalis.box(box4, "north") - unit(1.5, "lines"),

    inflect=TRUE,

    arrow=arrow(type="closed", angle=15, length=unit(2, "mm")), gp=gpar(fill="black"))


grid.curve(xDetalis.box(box3, "east"),

    yDetalis.box(box3, "south") + unit(0.5, "lines"),

    xDetalis.box(box5, "west"),

    yDetalis.box(box5, "north")- unit(1.5, "lines"),

    inflect=TRUE,

    arrow=arrow(type="closed", angle=15, length=unit(2, "mm")), gp=gpar(fill="black"))


640?wx_fmt=png

大家都在看

2017年R语言发展报告(国内)

精心整理 | R语言中文社区历史文章合集(作者篇)

精心整理 | R语言中文社区历史文章整理(类型篇)

640?wx_fmt=jpeg

公众号后台回复关键字即可学习

回复 爬虫            爬虫三大案例实战  
回复 
Python       1小时破冰入门

回复 数据挖掘     R语言入门及数据挖掘
回复 
人工智能     三个月入门人工智能
回复 数据分析师  数据分析师成长之路 
回复 机器学习      机器学习的商业应用
回复 数据科学      数据科学实战
回复 常用算法      常用数据挖掘算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值