Data Art with 100k digits of pi
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Data Art
As the name suggests, data art is an art created using data of any kind. Well, the definition may vary. It’s not an exact science. Some may use random data while others may use real life data. I recently came across the concept from the R graph Gallery.
I started off the experiments with digits of pi, denoted as π. It is a mathematical constant and defined as the ratio of a circle’s circumference to its diameter. Other definitions also exist, but this is good enough. It is also known as Archimedes constant.
It is an interesting number. It is an irrational number. \(\frac{22}{7}\)
is commonly used as the value. The decimal equivalent doesn’t end and also doesn’t follow any known pattern. The lack of pattern satisfies a kind of statistical randomness. Anyway, that’s too much of information.
#Art with digits of Pi
##Extracting data and preparing coordinates
The first step to start the art is to find the value of pi up to a certain number of digits. Several options are available. I used this.
I used the following code to extract data and create a data frame of coordinates by putting alternative digits in x and y.
1library(dplyr) 2library(ggplot2) 3 4#Defining URL to download csv (100k digits) 5url<-"https://www.angio.net/pi/digits/100000.txt" 6#reading file 7data.raw<-readr::read_file(url) 8 9#splitting string into single characters 10data.vec<-strsplit(data.raw, "") 11 12#vector to dataframe and 13data.df1<-data.frame(data.vec[1]) 14 15#removing the "." i.e. 2nd row 16data.df2<-data.frame(data.df1[-c(2),]) 17 18#renaming column to digits 19names(data.df2)[1]<-"digits" 20 21##Dividing the digits into x and y 22#Adding a column of row number 23data.df3<-data.df2%>% 24 mutate(id=seq(1:nrow(data.df2))) 25 26#Adding a column of coordinate (x or y) and reshuffling the columns 27data.df4<-data.df3%>% 28 mutate(cor=ifelse(id%%2==0,"y","x")) 29 30 31#changing class of digits to integers. Earlier parsed as char 32 33data.df4$digits<-as.integer(data.df4$digits) 34 35#Creating data frame of x and y coordinates 36x<-data.df4[c(T,F),1] 37y<-data.df4[c(F,T),1] 38 39data.cor<-data.frame(x,y) 40 41head(data.cor) 1## x y 2## 1 3 1 3## 2 4 1 4## 3 5 9 5## 4 2 6 6## 5 5 3 7## 6 5 8
Conceptualizing and creating the art
I decided to create an art using curves. I divided the coordinates into groups of thousand.In each group I plotted curve connecting all the dots to the first one. It created an interesting art which I like.
1#creating a column showing row position 2data.cor$pos<-seq(1:nrow(data.cor)) 3 4#defining the size of each group 5lot=1000 6 7#Creating groups 8data.plot<-data.cor%>% 9 mutate(grp=floor(pos/lot)+1) 10 11 12#Creating vectors with coordinates of first dot of each group 13minx=NULL 14miny=NULL 15for(i in 0:(49999)){ 16 j=(floor(i/lot)*lot)+1 17 minx[i+1]<-data.plot$x[j] 18 miny[i+1]<-data.plot$y[j] 19} 20 21#creating columns from vector 22data.plot$xend=minx 23data.plot$yend=miny 24 25#Removing rows containing coordinates of first point of each group 26 27rowrmv<-c(which(data.plot$x==data.plot$xend & data.plot$y==data.plot$yend)) 28 29data.plotf<-data.plot[-rowrmv,] 30 31#Plotting 32art100k.1<-data.plotf%>% 33 ggplot()+ 34 geom_curve(aes(x = x, y = y, xend = xend, yend = yend, colour = factor(x)), 35 curvature=0.2,alpha=0.2)+theme_void()+ scale_color_brewer(palette="Greys")+ 36 theme(legend.position = "none",panel.background = element_rect(fill="#000000"))+ 37 xlim(-1,10)+ylim(-1,10) 38 39plot(art100k.1)
I used a palette with limited number variants. Hence there was an error. But I don't mind that. You can experiment with different colours. Later, I edited the image output.
You can experiment further by changing the number or form of groups; even connect them to different points. Don't forget to share with me what you created.
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.