Создание диаграммы Санки для организационной диаграммы

У меня есть данные в таблице Excel с двумя соответствующими столбцами: имя сотрудника и имя менеджера.

Я хочу использовать networkD3 в R для создания диаграммы Санки с этими данными, чтобы показать, как наша организация распалась. Я относительный любитель R, но я смог создать диаграммы Санки, жестко закодировав каждый узел. Можно ли сделать это с данными, которые у меня есть?

    library(networkD3)
nodes = data.frame("name" = 
                     c(All_Employees$`Employee Name`))

links = as.data.frame(matrix(c(
  All_Employees$`Employee Name`,All_Employees$`Manager Name`,1),
  byrow = TRUE, ncol = 3))
names(links) = c("source", "target", "value")
sankeyNetwork(Links = links, Nodes = nodes,
              Source = "source", Target = "target",
              Value = "value", NodeID = "name",
              fontSize= 12, nodeWidth = 30)

1 ответ

Диаграмма Санки, вероятно, не самый лучший тип графика для этого, но если вы сначала упорядочите свои данные в правильном формате, это сработает...

All_Employees <- 
read.csv(header = T, na.strings = "", stringsAsFactors = F, check.names = F, 
text = "
Employee Name,Manager Name
Betty,
Tom,Betty
Bob,Betty
Mark,Tom
John,Tom
Sally,Bob")

node_names <- factor(sort(unique(as.character(unname(unlist(All_Employees))))))
nodes <- data.frame(name = node_names)
links <- data.frame(source = match(All_Employees$`Manager Name`, node_names) - 1, 
                    target = match(All_Employees$`Employee Name`, node_names) - 1,
                    value = 1)
links <- links[!is.na(links$source), ]

library(networkD3)
sankeyNetwork(Links = links, Nodes = nodes,
              Source = "source", Target = "target",
              Value = "value", NodeID = "name",
              fontSize = 12, nodeWidth = 30)

В качестве альтернативы, вы можете использовать diagonalNetwork() которая создает древовидную диаграмму, которая, вероятно, лучше подходит...

library(dplyr)
library(data.tree)
library(networkD3)

All_Employees %>% 
  filter(!is.na(`Manager Name`)) %>% 
  data.tree::FromDataFrameNetwork() %>%
  data.tree::ToListExplicit(unname = TRUE) %>%
  diagonalNetwork()

Или если вы используете версию Dev networkD3, вы можете более легко использовать новый treeNetwork() функция, которая имеет больше настроек (но все еще глючит, потому что она все еще в dev)...

library(dplyr)
library(networkD3)

All_Employees %>% 
  rename(nodeId = `Employee Name`, parentId = `Manager Name`) %>% 
  mutate(name = nodeId) %>% 
  treeNetwork(direction = "down", linkType = "elbow")

Другие вопросы по тегам