美文网首页数据-R语言-图表-决策-Linux-Python
爱你在心口难开,只能编程画出来。

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

作者: 9d760c7ce737 | 来源:发表于2019-08-07 15:49 被阅读0次

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

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

    相关文章

      网友评论

        本文标题:爱你在心口难开,只能编程画出来。

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