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

У меня есть данные в таблице 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)

person manchs07    schedule 01.03.2018    source источник
comment
Пожалуйста, приведите воспроизводимый пример.   -  person George Dontas    schedule 01.03.2018


Ответы (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()

введите здесь описание изображения

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

library(dplyr)
library(networkD3)

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

введите здесь описание изображения

person CJ Yetman    schedule 01.03.2018