继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

自然的步伐——pi前1万位小数数据可视化

九州编程
关注TA
已关注
手记 475
粉丝 42
获赞 203

版权所有。转载请保留作者和原文链接信息。

前些天在微信公众号上看到一篇文章,讲的是把圆周率pi的小位映射成曲谱,用钢琴演奏出来的效果(竟然还蜜汁好听……)

众所周知,圆周率是一个无限不循环的数学常数,然而它并不仅仅只是具有数学、物理含义,它代表着一种自然规律。正是这种玄妙的自然规律,以至于即使在听觉上映射成音符,也具有美妙的效果。数理、乐理,皆是自然之理,这种自然之理能在听觉上表示使人沉醉,那么理所当然,它也应当能在视觉上让人炫目。

事实上,两年前我就看到一位大神把可视化出来,的确具有让人眼前一亮的美观;根据当时传授给我的思想原理,这里复现一下。

主要思想如下:把pi小数位映射成单位向量,意即从原点作为起点,每一位小数映射成一个方向,基于这个方向向前走一步,映射完N位小数,走了N步,会是一种什么样的轨迹。

基于这个思想,我们把0-9归一化到0~2的弧度,从0开始,向量长度固定为1,根据弧度分解成笛卡尔坐标系下的位移,每一步基于上一步的坐标迭代计算出下一步的坐标,然后把路径图画出来。

下面直接上代码——————

library(ggplot2)
library(stringr)
library(dplyr)
nums <- str_extract_all(txt,"\\d") %>% unlist %>% as.numeric()
nums <- nums/9*360mat <- matrix(nrow=length(nums),ncol=3)
mat[,3] <- nums[1:nrow(mat)]

get_next_pos <- function(x,y,angle,i){
    delta_x <- cos(angle/360*2*pi)
    delta_y <- sin(angle/360*2*pi)    return(c(x+delta_x*i,y+delta_y*i))
}

mat[1,1:2] <- get_next_pos(0,0,nums[1],1)for(i in 2:nrow(mat)){
    mat[i,1:2] <- get_next_pos(mat[i-1,1],mat[i-1,2],nums[i],(1)^((i+1)%%2))
}

df <- as.data.frame(mat)
colnames(df) <- c("x","y","num")


ggplot(data = df[1:10000,],aes(x=x,y=y,color=num))+
    geom_path()+
    scale_color_gradient(low="#FED976",high="#BD0026")+
    labs(x="",y="")+
    guides(color=F)+
    theme(panel.background = element_rect(fill = "#212121"), 
          plot.background  = element_rect(fill = "#212121"), 
          panel.grid = element_blank(),
          legend.background = element_blank(),
          axis.text = element_blank(),
          axis.ticks = element_blank())

webp


(这怎么长得跟股价走势似的……)

这看起来很像时间序列曲线,是因为我们限定了每往前走一步的长度是1,所以它的走势总体上是向上的;假如把规则换一下呢:如果令奇数步向前走-1,偶数步向前走1呢——即根据小数位的方向,走一步退一步是什么样子的?

只要把上述代码某行的1改成-1即可,再看一下路径走势。


webp

这样一来就美观多了,一个有意思的现象是:路径中间有一大片空白,它所代表的数学含义是什么呢?



作者:真依然很拉风
链接:https://www.jianshu.com/p/7e406d17b78f


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP