Создание диаграммы Санки для организационной диаграммы
У меня есть данные в таблице 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")