美文网首页高级UI
无处不在的贝塞尔曲线

无处不在的贝塞尔曲线

作者: 9d760c7ce737 | 来源:发表于2019-06-15 23:26 被阅读64次

贝赛尔曲线(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天。

相关文章

网友评论

    本文标题:无处不在的贝塞尔曲线

    本文链接:https://www.haomeiwen.com/subject/qjtpfctx.html