簡體   English   中英

使用 ggraph 將 pi 數字繪制為連接束

[英]Plotting pi digits as connection bundles with ggraph

我希望將 Pi 的數字繪制為分層邊束,如圖所示

在此處輸入圖像描述

在這里,Pi 的數字按其顏色分組,然后每個數字都有一條邊連接到它后面的數字(即,如果 Pi 為 3.141,則 3 將有一條邊繪制到 1,1 將有一條邊連接到它后面的數字) 4,以此類推)。

這是我到目前為止的代碼

library(ggraph)
library(tidygraph)

dat_lagged <- structure(list(line = c(1L, 3L, 4L, 5L, 6L, 7L), digit = c("3", 
"1", "4", "1", "5", "9"), digit_lagged = c("1", "4", "1", "5", 
"9", "2"), group = c("3", "1", "4", "1", "5", "9")), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"))

from <- as.numeric(dat_lagged$digit)
to <- as.numeric(dat_lagged$digit_lagged)

ggraph(dat_lagged, 'dendrogram', circular = TRUE) +
  geom_conn_bundle(aes(colour = stat(group)),
                   data = get_con(from, to),
                   edge_alpha = 0.25)

然而,這是拋出錯誤

Error in if (is.numeric(v) && any(v < 0)) { : 
  missing value where TRUE/FALSE needed

嘿,我能夠使用線性布局創建類似的東西。 首先,從 data.frame 創建一個 tbl_graph 對象,其中包含 from、to 和“from”數字的等級。

我使用library(Rmpfr)為此獲得 1000 pi 數字。

library(Rmpfr)
digits <- Const("pi",1000)
#convert to string
pistr <- substr(capture.output(digits)[2],5,nchar(capture.output(digits)[2]))
#reformat string type object to from,to list of lists
reform <- lapply(seq(2,nchar(pistr)),function(x) {c(as.numeric(substr(pistr,x-1,x-1)),as.numeric(substr(pistr,x,x)))})
#bind list of lists to dataframe
do.call(rbind,reform) %>% data.frame -> pi1000
#remove NAs introduced by string of decimal .
pi1000 <- pi1000 %>% slice(-1)
#rename columns 
colnames(pi1000) <- c('from','to')
#reintroduce first connection, 3 -> 1
pi1000$from[1] <- 3
#remove final from,to line with missing "to" number
pi1000 <- pi1000 %>% filter(!is.na(from))
#add a rank for each from, to - we will use this to numerically "jitter" the connections later
pi1000$rank <- seq(1,length(pi1000[,1]))

#next, arrange from,to connections by 'from', so that when tbl_graph is called, nodes are ordered numerically
pi1000 <- pi1000 %>% arrange(from)

#convert from,to DF to tbl_graph
#the tbl_graph's edges are converted so that the from,to now refer to the index of the nodes (i.e. x+1)
piggraph <- pi1000 %>% as_tbl_graph

一旦 tbl_graph 如此格式化,使用更簡單的 ggraph 語法創建繪圖就變得更容易,但當設置為circular=T時,繪圖似乎會分崩離析。 “線性”布局讓您可以使用單個變量控制邊緣的位置 - 希望看到使用圓形格式的答案!

piggraph %>% ggraph(layout='linear') + 
    #arc2 creates a plot that can be colored by node by referring to the nodes of the tbl_graph (node.name)
    #add a component rank/length(rank) to make the edges jitter according to when the number happens in pi's sequence
    geom_edge_arc2(aes(x=x+(rank/(length(pi1000$rank))),color=as.factor(node.name))) +
    #add a label for each node and center it with nudge_x
    geom_node_text(aes(label=name),nudge_x = 0.5)

結果圖

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM