It is not an experiment if you know it is going to work (Jeff Bezos)
From time to time, I discover some of my experiments translated into Shiny Apps, like this one. Some days ago, I discovered one of these translations and I contacted the author, who was a guy from Vietnam called Vu Anh. I asked him to do a Shiny App from this experiment. Vu was enthusiastic with the idea. We defined some parameters to play with shape, number, width and alpha of lines as well as background color and I received a perfect release of the application in just a few hours. With just a handful of parameters, possible outputs are almost infinite. Following you can find some of them:
I think the code is a nice example to take the first steps in Shiny. If you are not used to Markdown files, you can follow this instructions to run the code.
Vu is a talented guy, who loves maths and programming. He represents the future of our nice profession and I predict a successful future for him. Do not miss his brand new blog. I am sure you will find amazing things there.
This is the code of the app:
---
title: "Maths, Music and Merkbar"
author: "Brother Rain"
date: "18/03/2015"
output: html_document
runtime: shiny
---
## Load Data
```{r}
library(circlize)
library(scales)
factors = as.factor(0:9)
lines = 2000 #Number of lines to plot in the graph
alpha = 0.4 #Alpha for color lines
colors0=c(
rgb(239,143,121, max=255),
rgb(126,240,188, max=255),
rgb(111,228,235, max=255),
rgb(127,209,249, max=255),
rgb( 74,106,181, max=255),
rgb(114,100,188, max=255),
rgb(181,116,234, max=255),
rgb(226,135,228, max=255),
rgb(239,136,192, max=255),
rgb(233,134,152, max=255)
)
# You can find the txt file here:
# http://www.goldennumber.net/wp-content/uploads/2012/06/Phi-To-100000-Places.txt
phi=readLines("data/Phi-To-100000-Places.txt")[5]
```
## Visualization
```{r, echo=FALSE}
fluidPage(
fluidRow(
column(width = 4,
sidebarPanel(
sliderInput("lines", "Number of lines:", min=100, max=100000, step=100, value=500),
sliderInput("alpha", "Alpha:", min=0.01, max=1, step=0.01, value=0.4),
sliderInput("lwd", "Line width", min=0, max=1, step=0.05, value=0.2),
selectInput("background", "Background:",
c("Purple" = "mediumpurple4", "Gray" = "gray25", "Orange"="orangered4",
"Red" = "red4", "Brown"="saddlebrown", "Blue"="slateblue4",
"Violet"="palevioletred4", "Green"="forestgreen", "Pink"="deeppink"), selected="Purple"),
sliderInput("h0", "h0:", min=0, max=0.4,
step=0.0005, value=0.1375),
sliderInput("h1", "h1:", min=0, max=0.4,
step=0.0005, value=0.1125),
width=12
)
),
column(width = 8,
renderPlot({
# get data
phi=gsub("\\.","", substr(phi,1,input$lines))
phi=gsub("\\.","", phi)
position=1/(nchar(phi)-1)
# create circos
circos.clear()
par(mar = c(1, 1, 1, 1), lwd = 0.1,
cex = 0.7, bg=alpha(input$background, 1))
circos.par(
"cell.padding"=c(0.01,0.01),
"track.height" = 0.025,
"gap.degree" = 3
)
circos.initialize(factors = factors, xlim = c(0, 1))
circos.trackPlotRegion(factors = factors, ylim = c(0, 1))
## create first region
for (i in 0:9) {
circos.updatePlotRegion(
sector.index = as.character(i),
bg.col = alpha(input$background, 1),
bg.border=alpha(colors0[i+1], 1)
)
}
for (i in 1:(nchar(phi)-1)) {
m=min(as.numeric(substr(phi, i, i)), as.numeric(substr(phi, i+1, i+1)))
M=max(as.numeric(substr(phi, i, i)), as.numeric(substr(phi, i+1, i+1)))
d=min((M-m),((m+10)-M))
col=t(col2rgb(colors0[(as.numeric(substr(phi, i, i))+1)]))
for(index in 1:3){
col[index] = max(min(255, col[index]), 0)
}
if (d>0) {
circos.link(
substr(phi, i, i), position*(i-1),
substr(phi, i+1, i+1), position*i,
h = input$h0 * d + input$h1,
lwd=input$lwd,
col=alpha(rgb(col, max=255), input$alpha), rou = 0.92
)
}
}
}, width=600, height=600, res=192)
)
)
)
```