R: 可视化文件夹路径

3

我正在使用R编程语言进行工作。

我正在尝试制作一个网络/树形可视化,显示我计算机上所有的文件夹、子文件夹和文件。

我找到了以下代码,可以列出我计算机上的所有文件/文件夹:

dirs <- list.dirs(path = ".", full.names = TRUE, recursive = TRUE)

从这里开始,我想要制作一个网络图可视化(例如使用igraph),以展示所有文件夹、子文件夹和文件的路径。

enter image description here https://www.reddit.com/r/dataisbeautiful/comments/ajcb4n/i_made_a_graph_visualization_of_my_projects/

我在这里找到了一篇帖子,展示了如何在有限的环境下完成这个操作:如何从目录树构建一个树状图? 但是我正在尝试直接对这个语句进行操作。
dirs <- list.dirs(path = ".", full.names = TRUE, recursive = TRUE)

有人可以帮我演示一下怎么做吗?

谢谢!

我的尝试:

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)

3
要获取一棵树,你可以使用jsTreeR包和Shiny - undefined
这些也许会对你有所帮助:https://stackoverflow.com/questions/36094183/how-to-build-a-dendrogram-from-a-directory-tree - undefined
2个回答

8
你可以使用 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()

enter image description here


8
我有几个建议:首先,你的树没有正确生成,因为dirnames并不提供目录的名称,而是整个名称。
你可以通过在edges数据框的定义中省略basename函数来解决这个问题。这可能也有助于解决重复的文件夹名称。你仍然可以使用其他方法更改名称。
V(g)$name <- basename(V(g)$name)

第二,如果你想要包括所有文件和目录,你的第一行可能应该是
filesAndDirs <- list.files(path = ".", full.names = TRUE, recursive = TRUE, include.dirs = TRUE)

最后,绘制图表时,你应该加入你的树的根节点。
plot(g, layout=layout_as_tree(g, root = 1))

我其实不能帮你制作一个漂亮的图表,但我希望这个能帮到你。

完整的代码如下:

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))

@ backboned:非常感谢您的回答!如果您有时间,能否请您写出从头到尾的完整代码?非常感谢! - undefined
这会产生一个多层次的图表吗?例如,文件夹、子文件夹、子子文件夹等等? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接