我正在使用 R 编程语言。
我正在尝试制作网络/树可视化,显示位于我的计算机上的所有文件夹、子文件夹和文件。
我发现以下代码可以列出我的计算机上的所有文件/文件夹:
dirs <- list.dirs(path = ".", full.names = TRUE, recursive = TRUE)
Run Code Online (Sandbox Code Playgroud)
从这里,我想制作一个网络图可视化(例如使用 igraph)来显示文件夹、子文件夹和文件的所有路径:
https://www.reddit.com/r/dataisbeautiful/comments/ajcb4n/i_made_a_graph_visualization_of_my_projects/
我在这里找到这篇文章,展示了如何在有限的设置下执行此操作:How to build a dendrogram from a Directory Tree?
但我试图直接为此声明执行此操作
dirs <- list.dirs(path = ".", full.names = TRUE, recursive = TRUE)
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我该怎么做吗?
谢谢!
我的尝试:
library(igraph)
library(data.tree)
dirs <- list.dirs(path = ".", full.names = TRUE, recursive = TRUE)
edges <- data.frame(from = dirname(dirs), to = basename(dirs), stringsAsFactors = FALSE)
g <- graph_from_data_frame(edges, directed=TRUE)
plot(g, layout=layout_as_tree)
Run Code Online (Sandbox Code Playgroud)
我有几点建议:首先,您的树没有正确生成,因为 dirnames 没有给出目录的名称,而是给出整个名称。
basename您可以通过在 data.frame 的定义中省略该函数来解决此问题edges。这也可能有助于解决重复的文件夹名称。您仍然可以使用以下命令更改名称
V(g)$name <- basename(V(g)$name)
Run Code Online (Sandbox Code Playgroud)
其次,如果您想要所有文件和目录,您的第一行可能应该是
filesAndDirs <- list.files(path = ".", full.names = TRUE, recursive = TRUE, include.dirs = TRUE)
Run Code Online (Sandbox Code Playgroud)
最后,在绘图时,您可能应该添加树的根:
plot(g, layout=layout_as_tree(g, root = 1))
Run Code Online (Sandbox Code Playgroud)
我真的无法帮助制作漂亮的图表,但无论如何我希望这会有所帮助。
整个代码是:
library(igraph)
filesAndDirs <- list.files(path = ".",
full.names = TRUE,
recursive = TRUE,
include.dirs = TRUE)
edges <- data.frame(from = dirname(filesAndDirs), to = filesAndDirs, stringsAsFactors = FALSE)
g <- graph_from_data_frame(edges, directed=TRUE)
V(g)$name <- basename(V(g)$name)
plot(g, layout=layout_as_tree(g, root = 1))
Run Code Online (Sandbox Code Playgroud)
您可以使用tidygraph和 来做到这一点ggraph:
library(igraph)
library(tidygraph)
library(ggraph)
do.call('rbind',
strsplit(dirs, '/') |>
lapply(\(x) sapply(seq_along(x), \(y) paste(x[1:y], collapse = '/'))) |>
lapply(\(x) cbind(head(x, -1), tail(x, -1)))
) |>
as.data.frame() |>
unique() |>
graph_from_data_frame() |>
as_tbl_graph() %>%
mutate(label = gsub('^.*/(.*)$', '\\1', name)) |>
ggraph(layout = 'tree') +
geom_edge_diagonal(color = 'gray') +
geom_node_point(shape = 21, fill = 'lightblue') +
geom_node_text(aes(label = label), size = 3, nudge_x = 0.4) +
coord_flip(clip = 'off') +
scale_y_reverse() +
theme_graph()
Run Code Online (Sandbox Code Playgroud)