Visualizando números irracionales

Un número irracional es aquel que no se puede expresar como fracción de enteros, o equivalentemente, que tiene infinitos decimales no periódicos.

En esta publicación se utilizarán diagramas de cuerdas para visualizar con R los primeros decimales de los 3 números irracionales más famosos: \(\pi\), \(\varphi\) y \(e\).

Visualizando los primeros 1000 decimales de \(\pi\)

Preprocesamiento

# Carga de paquetes 
library(circlize)
library(dplyr)

# 1000 decimales de PI
decimales <- "1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989"

# Separar los decimales
decimales %>% 
  strsplit(split = "") %>% 
  unlist -> decimales
length(decimales)
## [1] 1000

Vamos a crear un data.frame con las conexiones entre números: como origen estará cada decimal, y como destino su siguiente número en la secuencia de decimales.

origen <- NA
destino <- NA
for(i in 2:length(decimales)){
  origen <- c(origen, decimales[i - 1])
  destino <- c(destino, decimales[i])
}
data <- data.frame(origen, destino)
# Se quitan los NA del principio
data <- data[-1,]
head(data)
##   origen destino
## 2      1       4
## 3      4       1
## 4      1       5
## 5      5       9
## 6      9       2
## 7      2       6

Gráfico

grid.col <- rainbow(10)
names(grid.col) <- 0:9

chordDiagram(data, row.col = grid.col, grid.col = grid.col,
             order = 0:9, transparency = 0.2,
             annotationTrack = c("name", "grid"))
title(expression(paste("Visualizando ", pi)))
text(1.05, -1, "danielredondo.com", font = 8)
text(-0.015, 0.015, expression(pi))

Gráfico agrupado

También podemos agrupar las conexiones si tienen el mismo origen y destino.

adjacencyData <- with(data, table(origen, destino))
adjacencyData
##       destino
## origen  0  1  2  3  4  5  6  7  8  9
##      0  7 10 10  9  4 14  8  6  9 16
##      1 10 16 11 12 10  7  6 18 10 16
##      2 11 15  8 11  7  8  9 14 13  7
##      3 15 10  9 10 12  8  9 12 12  5
##      4  7  7  8  7 11  8 16  5 13 11
##      5  6 10 11 15  8  6 10  7  8 16
##      6 14  9 12  6 13  9 11  8  6  6
##      7  9 13  8 10  7 12  5  9 13  9
##      8  6 17 13  8 10  9 11  9  9  9
##      9  8  8 13 14 11 16  9  7  8 11
grid.col <- rainbow(10)
names(grid.col) <- 0:9

chordDiagram(adjacencyData, row.col = grid.col, grid.col = grid.col, 
             link.border = "black", transparency = 0,
             annotationTrack = c("name", "grid"))
title(expression(paste("Visualizando ", pi)))
text(1.05, -1, "danielredondo.com", font = 8)
text(0.02, 0.015, expression(pi))

Explorando paletas de colores

Los gráficos anteriores estaban hechos con la paleta rainbow. Ahora, probamos con algunas paletas de colores de RColorBrewer.

library(RColorBrewer)
grid.col <- brewer.pal(10, "Paired")
names(grid.col) <- 0:9

chordDiagram(data, row.col = grid.col, grid.col = grid.col,
             order = 0:9, transparency = 0.2,
             annotationTrack = c("name", "grid"))
title(expression(paste("Visualizando ", pi)))
text(1.05, -1, "danielredondo.com", font = 8)
text(-0.015, 0.015, expression(pi))

chordDiagram(adjacencyData, row.col = grid.col, grid.col = grid.col, 
             link.border = "black", transparency = 0,
             annotationTrack = c("name", "grid"))
title(expression(paste("Visualizando ", pi)))
text(1.05, -1, "danielredondo.com", font = 8)
text(0.03, 0.015, expression(pi))

grid.col <- brewer.pal(10, "RdYlBu")
names(grid.col) <- 0:9

chordDiagram(data, row.col = grid.col, grid.col = grid.col,
             order = 0:9, transparency = 0.2,
             annotationTrack = c("name", "grid"))
title(expression(paste("Visualizando ", pi)))
text(1.05, -1, "danielredondo.com", font = 8)
text(-0.015, 0.015, expression(pi))

chordDiagram(adjacencyData, row.col = grid.col, grid.col = grid.col,
             link.border = "black", transparency = 0,
             annotationTrack = c("name", "grid"))
title(expression(paste("Visualizando ", pi)))
text(1.05, -1, "danielredondo.com", font = 8)
text(0.03, 0.015, expression(pi))

Más gráficos

Con leves modificaciones al código, se pueden visualizar también los primeros 1000 decimales de \(e\):

Y los primeros 1000 decimales de \(\varphi\), con un estilo diferente: