今天不一样哈,记得去年这时候我在上海学习,晚上在酒店里面,必须带着降噪耳机才能安稳睡觉。
我们中国人大部分都是含蓄的,外国人在一起,母子之间经常会说“I love you”,而我, 根本开不了口,我觉得气氛会异常尴尬。
夫妻之间,也是哈,面对面也说不了。所以,给说这种温馨的话安排一个固定的时机,成了大家的心病,继而情人节因运而生,专门解决这个难题,这一天感情到位的都云淡风轻,感情欠一点的尽显风情,什么话都说的出来。
而我属于那种看起来外向,实际上含蓄的人,我和我妻子在一起10年了,当面喊出老婆
这两个字都会很不好意思,通常都是用昵称代替。我想到人群中一定会有跟我一样的人,所以,我决定在今天用编程帮帮他们。
首先,画颗心表达爱意
想要编程来画,就得找到表示心形的曲线函数。
还好,这个地方汇集了大量的曲线函数
http://mathworld.wolfram.com/topics/PolarCurves.html
而我在里面看到了心形
点进去之后,发现目前有6种函数可以画心,但是我喜欢的是最后一个
回到R语言中,把刚才看到的那个方程,写成一个函数,这个函数返回一个数据框,每一行代表一个点,这个点有x坐标,也有y坐标。
library(tidyverse)
heart_vertices <- function(xc,yc,size,npoints=100,...){
r = size*0.05
yc = yc + 0.1*r ## 调整心形的中心
t = seq(-pi,pi, length.out=npoints+1)
## 产生x
x = xc + 16 * r *(sin(t))^3
## 产生y
y = yc + r*13*cos(t) - r*5*cos(2*t) - r*2*cos(3*t) - r*cos(4*t)
df <- data.frame(theta=t,x=x,y=y)
return(df)
}
尝试调用函数,给出数据
dd <- heart_vertices(0,0,2)
现在只要用ggplot2
这个包中geom_polygon
函数来连接这些点就可以了。
library(ggplot2)
ggplot(dd)+
geom_polygon(aes(x=x,y=y), fill="#f03b20", color="#ece2f0",size=10) +
theme_void()
不可思议哈,理想照进现实就是这个样子,就这样,我们把那些高深的函数,化为己用,变成爱的语言。
接着,来点玫瑰增加气氛
画了上面的图之后,人是膨胀的,因为你知道,我们还有那么多画图的曲线函数没有用呢?
比如情人节,也要有玫瑰花啊
点进去,发现,确实有个函数在等我们
我们按照公式生成一个数据,里面的8是代表最终花有8瓣。
rose <- tibble(
t = seq(-pi,pi, length.out=1000),
r1 = cos(8*t)
)
用ggplot2
这个包中geom_polygon
函数来连接这些点:
ggplot(rose,aes(x=t, y=r1)) +
geom_polygon(fill="#f03b20", color="#ece2f0",size=2) +
theme_void()
发现是不行的,这个应该就是余弦函数的曲线吧
现在我要要改变他的坐标轴
ggplot(rose,aes(x=t, y=r1)) +
geom_polygon(fill="#f03b20", color="#ece2f0",size=2) +
coord_polar() +
theme_void()
最后,给只蝴蝶添加一点活力
现在爱她的心和玫瑰都有了,通常,招花引碟嘛,有了花还缺点蝴蝶啊什么的,还好,曲线库里面也有蝴蝶
image.png
点击去发现我们需要的是右边那个
有了方程就好办啊,写一个函数
butterfly_vertices <- function(xc,yc,npoints=1000,...){
t = seq(0,12*pi, length.out=npoints+1)
x = xc + sin(t)*(exp(cos(t))-2*cos(4*t)-sin(t/12)^5)
y = yc + cos(t)*(exp(cos(t))-2*cos(4*t)-sin(t/12)^5)
df <- data.frame(x=x,y=y,t=t)
return(df)
}
先产生一个数据来看看:
dd <- butterfly_vertices(1,1)
接下来还是用geom_polygon
来画图:
ggplot() +
geom_polygon(data=dd,
aes(x=x,y=y,fill=factor(floor(t/pi))), color="#000000de") +
theme_void() +
scale_fill_viridis_d(alpha=0.3, guide="none") +
scale_color_viridis_c(option="magma", guide="none")
现在爱心,玫瑰,蝴蝶都有了,还缺什么呢,我想应该是个孩子吧。但这个编程解决不了,靠大家的运气。
我是果子,祝大家情人节快乐。
网友评论