数据-R语言-图表-决策-Linux-Python

爱你在心口难开,只能编程画出来。

2019-08-07  本文已影响0人  9d760c7ce737

今天不一样哈,记得去年这时候我在上海学习,晚上在酒店里面,必须带着降噪耳机才能安稳睡觉。
我们中国人大部分都是含蓄的,外国人在一起,母子之间经常会说“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")

现在爱心,玫瑰,蝴蝶都有了,还缺什么呢,我想应该是个孩子吧。但这个编程解决不了,靠大家的运气。
我是果子,祝大家情人节快乐。

上一篇 下一篇

猜你喜欢

热点阅读