Skip to content

Commit

Permalink
add geom-link and layout
Browse files Browse the repository at this point in the history
  • Loading branch information
Hy4m committed Mar 8, 2020
1 parent 4990db7 commit 0fb0b26
Show file tree
Hide file tree
Showing 9 changed files with 724 additions and 3 deletions.
5 changes: 4 additions & 1 deletion DESCRIPTION
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ Suggests:
rmarkdown,
picante,
WGCNA
RoxygenNote: 6.1.1
RoxygenNote: 7.0.2
VignetteBuilder: knitr
Collate:
'add-link-extra-params.R'
Expand All @@ -59,6 +59,7 @@ Collate:
'cor-tbl.R'
'cor-tbl-utils.R'
'cor-test.R'
'create-layout.R'
'display-cor.R'
'dplyr.R'
'draw-key.R'
Expand All @@ -74,6 +75,8 @@ Collate:
'geom-ellipse2.R'
'geom-grid.R'
'geom-hc-rect.R'
'geom-link.R'
'geom-link2.R'
'geom-mark.R'
'geom-num.R'
'geom-pie2.R'
Expand Down
20 changes: 20 additions & 0 deletions NAMESPACE
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ export(GeomCircle2)
export(GeomConfbox)
export(GeomCross)
export(GeomEllipse2)
export(GeomLink)
export(GeomLowerCircle2)
export(GeomLowerColour)
export(GeomLowerEllipse2)
Expand Down Expand Up @@ -92,6 +93,7 @@ export(as_tbl_graph)
export(as_tibble)
export(brown_blue)
export(brown_purple)
export(combination_layout)
export(cor_network)
export(cor_tbl)
export(correlate)
Expand All @@ -112,8 +114,14 @@ export(geom_confbox)
export(geom_cross)
export(geom_diag_label)
export(geom_ellipse2)
export(geom_end_label)
export(geom_end_point)
export(geom_grid)
export(geom_hc_rect)
export(geom_link)
export(geom_link2)
export(geom_link_label)
export(geom_link_point)
export(geom_lower_circle2)
export(geom_lower_color)
export(geom_lower_colour)
Expand All @@ -129,6 +137,8 @@ export(geom_ring)
export(geom_shade)
export(geom_square)
export(geom_star)
export(geom_start_label)
export(geom_start_point)
export(geom_upper_circle2)
export(geom_upper_color)
export(geom_upper_colour)
Expand All @@ -141,10 +151,12 @@ export(get_col_name)
export(get_data)
export(get_diag_data)
export(get_diag_tri)
export(get_end_nodes)
export(get_hc_rect_df)
export(get_lower_data)
export(get_row_name)
export(get_show_diag)
export(get_start_nodes)
export(get_type)
export(get_upper_data)
export(ggcor)
Expand All @@ -160,6 +172,7 @@ export(link_params)
export(mantel_test)
export(matrix_order)
export(mutate)
export(parallel_layout)
export(pink_green)
export(point_params)
export(purple_green)
Expand Down Expand Up @@ -224,6 +237,8 @@ importFrom(dplyr,mutate)
importFrom(dplyr,rename)
importFrom(dplyr,ungroup)
importFrom(ggplot2,Geom)
importFrom(ggplot2,GeomCurve)
importFrom(ggplot2,GeomPoint)
importFrom(ggplot2,GeomPolygon)
importFrom(ggplot2,GeomSegment)
importFrom(ggplot2,GeomText)
Expand All @@ -236,6 +251,7 @@ importFrom(ggplot2,continuous_scale)
importFrom(ggplot2,coord_fixed)
importFrom(ggplot2,discrete_scale)
importFrom(ggplot2,draw_key_blank)
importFrom(ggplot2,draw_key_path)
importFrom(ggplot2,draw_key_polygon)
importFrom(ggplot2,draw_key_text)
importFrom(ggplot2,element_blank)
Expand Down Expand Up @@ -263,6 +279,7 @@ importFrom(ggplot2,scale_y_continuous)
importFrom(ggplot2,theme)
importFrom(ggplot2,waiver)
importFrom(graphics,plot)
importFrom(grid,gTree)
importFrom(grid,grid.draw)
importFrom(grid,grobTree)
importFrom(grid,is.unit)
Expand All @@ -279,8 +296,11 @@ importFrom(purrr,pmap_dfr)
importFrom(purrr,walk)
importFrom(purrr,walk2)
importFrom(rlang,"!!")
importFrom(rlang,enquo)
importFrom(rlang,eval_tidy)
importFrom(rlang,quo_get_expr)
importFrom(rlang,quo_is_null)
importFrom(rlang,set_names)
importFrom(rlang,sym)
importFrom(scales,discard)
importFrom(scales,div_gradient_pal)
Expand Down
197 changes: 197 additions & 0 deletions R/create-layout.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
#' Transform data
#' @description These layout functions are not layout in the network diagram,
#' it just converts the original data into a form that makes it easy to draw
#' a curve graph.
#' @param data a data frame.
#' @param start.var,end.var character to specify which variable is the starting
#' points and which is the ending points. if the variable is not character, it
#' is forced to be converted.
#' @param horiz a logical value. If FALSE, the parallel graph are drawn vertically.
#' If TRUE, the parallel graph are drawn horizontally.
#' @param sort.start,sort.end charater vector, the nodes will be sorted by this parameter.
#' @param start.x,start.y,end.x,end.y numeric to specify the x (horiz = TRUE) or y
#' (horiz = FALSE) coordinates.
#' @param type the type (""upper" or "lower") of the correlation matrix plot.
#' @param show.diag a logical value indicating whether keep the diagonal.
#' @param row.names,col.names row/column names of correlation matrix.
#' @param cor_tbl a col_tbl object.
#' @return a data frame.
#' @importFrom rlang enquo eval_tidy set_names quo_is_null
#' @importFrom dplyr filter
#' @rdname create-layout
#' @examples
#' cor_tbl(cor(mtcars)) %>%
#' parallel_layout()
#' \dontrun{
#' data("varespec", package = "vegan")
#' data("varechem", package = "vegan")
#' mantel_test(varespec, varechem) %>%
#' combination_layout(type = "upper", col.names = colnames(varechem),
#' show.diag = FALSE)
#' }
#' @author Houyun Huang, Lei Zhou, Jian Chen, Taiyun Wei
#' @export
parallel_layout <- function(data,
start.var = NULL,
end.var = NULL,
horiz = FALSE,
sort.start = NULL,
sort.end = NULL,
start.x = NULL,
start.y = NULL,
end.x = NULL,
end.y = NULL)
{
if(!is.data.frame(data))
data <- as.data.frame(data)
start <- if(rlang::quo_is_null(enquo(start.var))) {
data[[1]]
} else {
rlang::eval_tidy(rlang::enquo(start.var), data)
}
end <- if(rlang::quo_is_null(enquo(end.var))) {
data[[2]]
} else {
rlang::eval_tidy(rlang::enquo(end.var), data)
}
if(!is.character(start))
start <- as.character(start)
if(!is.character(end))
end <- as.character(end)

unique.start <- unique(start[!is.na(start)])
unique.end <- unique(end[!is.na(end)])
n <- max(length(unique.start), length(unique.end))
if(!is.null(sort.start) && length(sort.start) != length(unique.start)) {
stop("Length of 'sort.start' and unique elements of 'start' don't match.",
call. = FALSE)
}
if(!is.null(sort.end) && length(sort.end) != length(unique.end)) {
stop("Length of 'sort.end' and unique elements of 'end' don't match.",
call. = FALSE)
}
start.pos <- if(is.null(sort.start)) {
rlang::set_names(seq(1, n, length.out = length(unique.start)), unique.start)
} else {
rlang::set_names(seq_len(length.out = length(sort.start)), sort.start)
}
end.pos <- if(is.null(sort.start)) {
rlang::set_names(seq(1, n, length.out = length(unique.end)), unique.end)
} else {
rlang::set_names(seq_len(length.out = length(sort.end)), sort.end)
}
pos <- if(horiz) {
tibble::tibble(x = start.pos[start], y = start.y %||% 0, xend = end.pos[end],
start.label = start, end.label = end, yend = end.y %||% 1,
.start.filter = !duplicated(start) & !is.na(start),
.end.filter = !duplicated(end) & !is.na(end))
} else {
tibble::tibble(x = start.x %||% 0, y = start.pos[start], xend = end.x %||% 1,
start.label = start, end.label = end, yend = end.pos[end],
.start.filter = !duplicated(start) & !is.na(start),
.end.filter = !duplicated(end) & !is.na(end))
}
structure(.Data = dplyr::bind_cols(pos, data),
class = c("layout_link_tbl", class(pos)))
}

#' @rdname create-layout
#' @export
combination_layout <- function(data,
type = NULL,
show.diag = NULL,
row.names = NULL,
col.names = NULL,
start.var = NULL,
end.var = NULL,
cor_tbl)
{
non.cor.tbl <- missing(cor_tbl)
if(!non.cor.tbl) {
if(!is_cor_tbl(cor_tbl) || !is_symmet(cor_tbl))
stop("Need a symmetric cor_tbl.", call. = FALSE)
}
row.names <- if(non.cor.tbl) {
rev(row.names) %||% col.names
} else {
rev(get_row_name(cor_tbl))
}
type <- if(non.cor.tbl) type else get_type(cor_tbl)
show.diag <- if(non.cor.tbl) show.diag else get_show_diag(cor_tbl)
start <- if(rlang::quo_is_null(enquo(start.var))) {
data[[1]]
} else {
rlang::eval_tidy(rlang::enquo(start.var), data)
}
end <- if(rlang::quo_is_null(enquo(end.var))) {
data[[2]]
} else {
rlang::eval_tidy(rlang::enquo(end.var), data)
}
if(!is.character(start))
start <- as.character(start)
if(!is.character(end))
end <- as.character(end)

spec.name <- unique(start[!is.na(start)])
n <- length(row.names)
m <- length(spec.name)
## get position of spec point
if(type == "full") {
stop("The 'type' of cor_tbl is not supported.", call. = FALSE)
}

if(type == "upper") {
if(m == 1) {
x <- 0.5 + 0.18 * n
y <- 0.5 + 0.3 * n
} else if(m == 2) {
x <- c(0.5 - 0.02 * n, 0.5 + 0.2 * n)
y <- c(0.5 + 0.46 * n, 0.5 + 0.2 * n)
} else {
y <- seq(0.5 + n * (1 - 0.3), 0.5 + n * 0.1, length.out = m)
x <- seq(0.5 - 0.25 * n, 0.5 + 0.3 * n, length.out = m)
}
} else if(type == "lower") {
if(m == 1) {
x <- 0.5 + 0.82 * n
y <- 0.5 + 0.7 * n
} else if(m == 2) {
x <- c(0.5 + 0.8 * n, 0.5 + 1.02 * n)
y <- c(0.5 + 0.8 * n, 0.5 + 0.54 * n)
} else {
y <- seq(0.5 + n * (1 - 0.1), 0.5 + n * 0.3, length.out = m)
x <- seq(0.5 + 0.75 * n, 0.5 + 1.3 * n, length.out = m)
}
}
x <- rlang::set_names(x, spec.name)
y <- rlang::set_names(y, spec.name)

## get position of env point
xend <- n:1
yend <- 1:n
if(type == "upper") {
if(show.diag) {
xend <- xend - 2
} else {
xend <- xend - 1
}
} else {
if(show.diag) {
xend <- xend + 2
} else {
xend <- xend + 1
}
}
xend <- rlang::set_names(xend, row.names)
yend <- rlang::set_names(yend, row.names)

## bind postion end data
pos <- tibble::tibble(x = x[start], y = y[start],
xend = xend[end], yend = yend[end],
start.label = start, end.label = end,
.start.filter = !duplicated(start) & !is.na(start),
.end.filter = !duplicated(end) & !is.na(end))
structure(.Data = dplyr::bind_cols(pos, data),
class = c("layout_link_tbl", class(pos)))
}
Loading

0 comments on commit 0fb0b26

Please sign in to comment.