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