贝赛尔曲线(Bézier curve)属于那种运用很广,但是名声不大的技术。在PS中的钢笔工具,增加顶点拉曲线的那个曲线就是贝塞尔曲线。
photoshop中的钢笔工具十分有用,在抠图的时候常常大放异彩,但是初学者常常不得要领,有一个著名的网页就是通过游戏来让大家掌握钢笔工具,他的名称里面就有bezier
https://bezier.method.ac/
这个游戏要求我们用钢笔工具绘制多种形状,比如圆形
还有心型
有兴趣的可以去练一练通关,对自己大有裨益,2年前的时候,我在第四关就卡住了。
原理
贝赛尔曲线原理我也搞不清楚,大概是这样的:
有ABC,两条连接线
在AB上取一点D,在BC上去一点E,AD/AB=BE/BC
情况有很多,其中一个是这样
此时在DE上取一点F,使得AD/AB=BE/BC=DF/DE
把所有情况下的F点连接起来就是贝塞尔曲线
这是三个点的情况,如果是四个点,就叫三阶贝赛尔曲线
点数越多越复杂
R语言实现
ggforce
包中的``````geom_bezier```图层可以实现二阶和三阶的贝塞尔曲线,也就是前后加起来最多四个点
我们用之前的配对样本作图来举例子
load(file = "plot_data.Rdata")
library(ggplot2)
## 高表达
ggplot(data, aes(group,CYP1B1,fill=group)) +
geom_boxplot() +
geom_point(size=2, alpha=0.5) +
geom_line(aes(group=pairinfo), colour="black", linetype="11") +
xlab("") +
ylab(paste("Expression of ","CYP1B1"))+
theme_classic()+
theme(legend.position = "none")
现在用贝塞尔曲线代替那个连接线试试,这时候要创建一个新的数据,每一配对组的数据产生一根线,每根连线来自四个点的数据。是这样的:
以下是简易代码:
library(dplyr)
bdata <- data[,c("pairinfo","group","CYP1B1")] %>%
arrange(pairinfo)
bdata <- bdata[rep(1:nrow(bdata),each=2),]
bdata$group <- rep(c(1,1.3,1.7,2),18)
bdata$pairinfo <- as.integer(bdata$pairinfo)
现在只要把原画图代码geom_line
替换成geom_bezier
就可以了
library(ggforce)
ggplot(data, aes(factor(group),CYP1B1,fill=factor(group))) +
geom_boxplot() +
geom_point(size=2, alpha=0.5) +
geom_bezier(data=bdata,aes(x= group, y = CYP1B1, group = pairinfo))+
xlab("") +
ylab(paste("Expression of ","CYP1B1"))+
theme_classic()+
theme(legend.position = "none")
接下来我尝试了多组数据的贝塞尔连接,但是这个图层不支持,所以我就添加了三个geom_bezier
图层来实现。
这个图可以用来表示处理因素下某个基因的变化情况,在本例中,这个基因先上升后下降。
对比一下不加曲线的情况:
这个图没有显示出基因在单个样本中的变化趋势,也缺少一点气势。
在前端时间,群里还有人用贝塞尔曲线实现了这个图:
很好看,也很生猛,然而我并不会,也不知道要用在什么数据上,以后碰到了再来尝试实现它。
好了,今天就这样,我是果子,这是六个月写作计划的第6天。
网友评论