rm(list = ls())
###############################input data 
library(ggraph)
## 载入需要的程辑包:ggplot2
library(igraph)
## 
## 载入程辑包:'igraph'
## The following objects are masked from 'package:stats':
## 
##     decompose, spectrum
## The following object is masked from 'package:base':
## 
##     union
library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v tibble  3.1.6     v dplyr   1.0.8
## v tidyr   1.2.0     v stringr 1.4.0
## v readr   2.1.2     v forcats 0.5.1
## v purrr   0.3.4
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::as_data_frame() masks tibble::as_data_frame(), igraph::as_data_frame()
## x purrr::compose()       masks igraph::compose()
## x tidyr::crossing()      masks igraph::crossing()
## x dplyr::filter()        masks stats::filter()
## x dplyr::groups()        masks igraph::groups()
## x dplyr::lag()           masks stats::lag()
## x purrr::simplify()      masks igraph::simplify()
data=data.frame(
  level1="CEO",
  level2=c( rep("boss1",4), rep("boss2",4)),
  level3=paste0("mister_", letters[1:4])
)
data
##   level1 level2   level3
## 1    CEO  boss1 mister_a
## 2    CEO  boss1 mister_b
## 3    CEO  boss1 mister_c
## 4    CEO  boss1 mister_d
## 5    CEO  boss2 mister_a
## 6    CEO  boss2 mister_b
## 7    CEO  boss2 mister_c
## 8    CEO  boss2 mister_d
edges_level1_2 = data %>% select(level1, level2) %>% unique %>% rename(from=level1, to=level2)
edges_level2_3 = data %>% select(level2, level3) %>% unique %>% rename(from=level2, to=level3)
edge_list=rbind(edges_level1_2, edges_level2_3)
edge_list
##     from       to
## 1    CEO    boss1
## 5    CEO    boss2
## 11 boss1 mister_a
## 2  boss1 mister_b
## 3  boss1 mister_c
## 4  boss1 mister_d
## 51 boss2 mister_a
## 6  boss2 mister_b
## 7  boss2 mister_c
## 8  boss2 mister_d
#################
mygraph <- graph_from_data_frame( edge_list )
mygraph  
## IGRAPH af0051e DN-- 7 10 -- 
## + attr: name (v/c)
## + edges from af0051e (vertex names):
##  [1] CEO  ->boss1    CEO  ->boss2    boss1->mister_a boss1->mister_b
##  [5] boss1->mister_c boss1->mister_d boss2->mister_a boss2->mister_b
##  [9] boss2->mister_c boss2->mister_d
ggraph(mygraph, layout = 'dendrogram', circular = FALSE) + 
  geom_edge_diagonal() +
  geom_node_point() +
  theme_void()
## Multiple parents. Unfolding graph

ltdf = create_layout(mygraph, layout = 'dendrogram')
## Multiple parents. Unfolding graph
ltdf
##      x y  leaf     name .ggraph.orig_index circular .ggraph.index
## 1  3.5 2 FALSE      CEO                  1    FALSE             1
## 2  1.5 1 FALSE    boss1                  2    FALSE             2
## 3  5.5 1 FALSE    boss2                  3    FALSE             3
## 4  0.0 0  TRUE mister_a                  4    FALSE             4
## 5  1.0 0  TRUE mister_b                  5    FALSE             5
## 6  2.0 0  TRUE mister_c                  6    FALSE             6
## 7  3.0 0  TRUE mister_d                  7    FALSE             7
## 8  4.0 0  TRUE mister_a                  4    FALSE             8
## 9  5.0 0  TRUE mister_b                  5    FALSE             9
## 10 6.0 0  TRUE mister_c                  6    FALSE            10
## 11 7.0 0  TRUE mister_d                  7    FALSE            11
ggraph(mygraph, layout = 'dendrogram', circular = FALSE) + 
  geom_edge_diagonal() + 
  geom_node_label(aes(label = name)) +    # name is a column in the layout data frame
  theme_void()
## Multiple parents. Unfolding graph

ltdf$location = c("Texas", "Texas", "California", "Texas", "Oklahoma", "New Mexico", "Arizona", "California", "Oregon", "Nevada", "Washington")

ggraph(ltdf) + 
  geom_edge_diagonal() + 
  geom_node_label(aes(label = paste(name, location, sep = "\n")), size = 3.7) +  
  coord_cartesian(xlim = c(0.5,8.5), ylim = c(-0.2, 2.2)) +
  theme_void()

##########################
#https://chapmandu2.github.io/orgsurveyr_docs/articles/organisations_with_ggraph.html